Чтобы автоматически добавить столбец во второй таблице, чтобы связать его с первой таблицей с помощью уникального индекса, у меня есть правило, такое как:
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 , является следующим идентификатором последовательности. Итак, эта команда:
INSERT INTO user (username) VALUES ('john');
вставит столбец [1, 'john', ...] в user , но столбец [2, ...] в lastlogin . Следующие 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');
Первый обходной путь будет использовать тот же идентификатор, а второй обходной путь - это все виды ошибок.
Возможно ли это сделать с помощью правил postgresql, или я должен просто сделать 2-ю вставку в lastlogin самостоятельно или использовать триггер строки? На самом деле, я думаю, что триггер строки также будет автоматически увеличивать последовательность при доступе к NEW.userid .