2 番目のテーブルに列を自動的に追加して、一意のインデックスを介して最初のテーブルに関連付けるには、次のようなルールがあります。
CREATE OR REPLACE RULE auto_insert AS ON INSERT TO user DO ALSO
INSERT INTO lastlogin (id) VALUES (NEW.userid);
user.useridが整数の場合、これは正常に機能します。ただし、シーケンスの場合 (たとえば、タイプserialまたはbigserial )、テーブルlastloginに挿入されるのは、次のシーケンス ID です。したがって、このコマンド:
INSERT INTO user (username) VALUES ('john');
列 [1, 'john', ...] をuserに挿入しますが、列 [2, ...] をlastloginに挿入します。次の 2 つの回避策は機能しますが、2 番目の回避策では、シーケンスがまだ自動インクリメントされているため、2 倍のシリアルが消費されます。
CREATE OR REPLACE RULE auto_insert AS ON INSERT TO user DO ALSO
INSERT INTO lastlogin (id) VALUES (lastval());
CREATE OR REPLACE RULE auto_insert AS ON INSERT TO user DO ALSO
INSERT INTO lastlogin (id) VALUES (NEW.userid-1);
残念ながら、複数の行を挿入している場合、回避策は機能しません。
INSERT INTO user (username) VALUES ('john'), ('mary');
最初の回避策は同じ ID を使用し、2 番目の回避策はあらゆる種類の失敗です。
postgresqlルールを介してこれを行うことは可能ですか、それともlastloginへの2回目の挿入を自分で行うか、行トリガーを使用する必要がありますか? 実際、 NEW.useridにアクセスすると、行トリガーもシーケンスを自動インクリメントすると思います。