0

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

 CREATE TABLE test_table (id serial, unique_id varchar(50) primary key, name varchar(50));

 test_table
 ----------
 id | unique_id | name

在该表中,我想用新插入的 id 与插入的名称一次性更新 unique_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);

有没有办法在单个查询中完成上述操作?

4

1 回答 1

0

您可以在这里有几个选项,您可以创建一个使用生成的 ID 直接更新同一行的 AFTER 触发器:

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

于 2013-01-08T08:28:14.273 回答