项目背景:
项目中给A表添加数据时会自动调用“触发器”给B表初始化默认数据(即:B表数据依赖于A表);
现项目需要新增表C,在A表添加数据时也自动调用“触发器”给C表初始化默认数据;但因产品外部已在使用,需要兼容表A的数据已经添加完成的场景--因表A已存在数据,导致 A表中已存在数据,无法通过触发器给C表初始化默认数据;
解决方案:
创建自定义函数funC:若C表中无数据--通过A表中数据,给C表初始化默认数据;
创建自定义函数funA:判断A表中是否已存在数据;若存在--调用函数funC
----设备(linux 嵌入式设备)上电 数据库初始化阶段,pgsql数据库 调用函数funA 完成C表中初始化默认数据
代码如下:update.sql文件
1、创建C表
2、创建自定义函数 funC、funA
3、调用funA
--表A:park_info 停车表;表C:lcd_config
park_info (
park_id RES_CODE PRIMARY KEY, ---主键为库id
park_name varchar(128) , ---停车名称
);
-- 步骤1:create table: lcd_config
CREATE TABLE IF NOT EXISTS lcd_config (
config_id RES_CODE PRIMARY KEY, ---主键为库id
park_id INT REFERENCES park_info ON DELETE CASCADE,
use_type INT, --类型(入出)
……
);
-------------------------------------------------------------------
--步骤2:创建自定义函数
CREATE OR REPLACE FUNCTION funC()
RETURNS VARCHAR AS $$
DECLARE
TMP_ID INTEGER; -- lcd配置id
TMP_COUNT INTEGER; -- 停车总数
TMP_ParkID INTEGER; -- 停车id
i INTEGER; -- 循环索引
BEGIN
select count(*) into TMP_COUNT from park_info ;
TMP_ParkID = 0;
FOR i in 0..TMP_COUNT-1 LOOP
select config_id into TMP_ID from lcd_config order by config_id desc; -- 查找表中最大id,没有则置为0
if TMP_ID is null then
TMP_ID = 0;
end if;
--循环获取停车ID
select park_id into TMP_ParkID from park_info where park_id > TMP_ParkID order by park_id ASC;
--初始化C表默认数据
insert into lcd_config (config_id, park_id, use_type) values(TMP_ID + 1, TMP_ParkID, 0);
insert into lcd_config (config_id, park_id, use_type) values(TMP_ID + 2, TMP_ParkID, 1);
---此外,还可以初始化其他表中默认数据, 如下所示
--insert into lcd_position_config(config_id, use_type, topleft_x, topleft_y, botright_x, botright_y) values(TMP_ID + 1, 0, 0, 100, 500, 600);
END LOOP;
RETURN 'create default lcd data end, park tbl is exist';
END;
$$ LANGUAGE plpgsql;
--------------------------------------
CREATE OR REPLACE FUNCTION funA()
RETURNS VARCHAR AS $$
BEGIN
IF EXISTS (
SELECT 1
FROM park_info
WHERE park_id = 1
) THEN
IF NOT EXISTS (
SELECT 1
FROM lcd_config
WHERE park_id = 1
) THEN
-- lcd_config未初始化数据;
RETURN funC();
ELSE
-- lcd_config已初始化数据;
return 'default lcd data have created, park tbl is exist';
END IF;
ELSE
-- 停车表数据不存在;
return 'no need create default lcd data, park tbl is not exist';
END IF;
END;
$$ LANGUAGE plpgsql;
-------------------------------------------------------------------
--步骤3:调用函数
SELECT funA();