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 フィールドを更新したいと思います。

通常、これは 2 つのクエリによって実行されます。(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 に答える