PG数据库写入一张主键表,主键存在就将数据更新,没有就新增一条记录
发布人:shili8
发布时间:2025-02-24 15:39
阅读次数:0
**PG数据库写入一张主键表**
在 PostgreSQL 中,我们可以使用 `INSERT INTO`语句来向一张表中插入新记录。然而,如果我们想要实现一个功能,即当主键存在时更新数据,而当主键不存在时新增一条记录,那么就需要稍微复杂一些的逻辑。
**解决方案**
我们可以使用以下方法来实现这个功能:
1. 首先,检查是否存在主键。如果存在,则执行 `UPDATE`语句;如果不存在,则执行 `INSERT INTO`语句。
2. 使用 `MERGE`语法(PostgreSQL9.4 或更高版本支持)来合并两个表格。这个方法可以在一个 SQL语句中同时更新和插入数据。
**使用 MERGE语法**
sqlDO $$ DECLARE _id integer; BEGIN -- 检查是否存在主键 SELECT id INTO _id FROM 表名 WHERE 主键条件; IF FOUND THEN -- 如果存在,则执行 UPDATE语句 UPDATE 表名 SET 列1 = 值1, 列2 = 值2 WHERE 主键条件; ELSE -- 如果不存在,则执行 INSERT INTO语句 INSERT INTO 表名 (列1, 列2) VALUES (值1, 值2); END IF; END $$;
**使用 CASE语法**
sqlDO $$ BEGIN -- 检查是否存在主键 IF EXISTS (SELECT1 FROM 表名 WHERE 主键条件) THEN -- 如果存在,则执行 UPDATE语句 UPDATE 表名 SET 列1 = 值1, 列2 = 值2 WHERE 主键条件; ELSE -- 如果不存在,则执行 INSERT INTO语句 INSERT INTO 表名 (列1, 列2) VALUES (值1, 值2); END IF; END $$;
**使用触发器**
sqlCREATE OR REPLACE FUNCTION trig_insert_update() RETURNS TRIGGER AS $$ BEGIN -- 检查是否存在主键 IF EXISTS (SELECT1 FROM 表名 WHERE 主键条件) THEN -- 如果存在,则执行 UPDATE语句 UPDATE 表名 SET 列1 = NEW.列1, 列2 = NEW.列2 WHERE 主键条件; ELSE -- 如果不存在,则执行 INSERT INTO语句 INSERT INTO 表名 (列1, 列2) VALUES (NEW.列1, NEW.列2); END IF; RETURN NEW; END $$ LANGUAGE plpgsql; CREATE TRIGGER trig_insert_update_triggerBEFORE INSERT OR UPDATE ON 表名FOR EACH ROW EXECUTE PROCEDURE trig_insert_update();
**注意**
* 在使用 `MERGE`语法时,PostgreSQL 必须支持该功能(9.4 或更高版本)。
* 使用 `CASE`语法或触发器时,不需要考虑 PostgreSQL 的版本。
* 在使用触发器时,请确保在表中创建一个名为 `trig_insert_update()` 的函数,并将其与表相关联。
以上是对 PG数据库写入一张主键表的解决方案。