假设我有一个表,创建如下:
CREATE TABLE test_table (id serial, unique_id varchar(50) primary key, name varchar(50));
test_table
----------
id | unique_id | name
在该表中,我想更新unique_id字段,其中新插入的id与插入的名称连接在一起。
通常这是通过两个查询完成的。 (PHP方式)
$q = "INSERT INTO table (unique_id,name) values ('uid','abc') returning id||name as unique_id;";
$r = pg_query($dbconn,$q);
$row = pg_fetch_array($r);
$q1 = "UPDATE test_table set unique_id =".$row['unique_id']." where unique_id='uid'";
$r1 = pg_query($dbconn,$q1);
有没有办法在单个查询中执行上述操作?
答案 0 :(得分:0)
你可以在这里有几个选项,你可以创建一个AFTER触发器,它使用生成的ID直接更新同一行:
CREATE TRIGGER test_table_insert ON AFTER INSERT ON test_table FOR EACH ROW EXECUTE PROCEDURE test_table_insert();
在您的函数中更新值:
CREATE FUNCTION test_table_insert() RETURNS TRIGGER AS $$
BEGIN
UPDATE test_table SET uniqid = NEW.id::text || NEW.name WHERE id = NEW.id;
END;
$$ LANGUAGE plpgsql;
您需要在触发器之前添加该功能。
另一种选择是直接在插入中执行:
INSERT INTO table (id, unique_id, name) values (nextval('test_table_id_seq'), 'abc', currval('test_table_id_seq')::text || 'abc') returning id;
但正如a_horse_with_no_name指出的那样,我认为您的数据库设计可能存在问题。