在单个查询中更新插入行的列及其生成的ID

时间:2013-01-08 07:58:42

标签: postgresql insert insert-update

假设我有一个表,创建如下:

 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);

有没有办法在单个查询中执行上述操作?

1 个答案:

答案 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指出的那样,我认为您的数据库设计可能存在问题。