Сравнение внешнего ключа в PostgreSQL

Просто любопытно, если у меня есть эта таблица:

CREATE TABLE "post" ( "id" SERIAL, "revision" INTEGER NOT NULL DEFAULT 0, "summary" CHARACTER VARYING NOT NULL, "description" TEXT NOT NULL, "user_id" INTEGER NOT NULL REFERENCES "user" ("id") MATCH FULL ON UPDATE CASCADE ON DELETE RESTRICT, "post_type_id" INTEGER NOT NULL REFERENCES "post_type" ("id") MATCH FULL ON UPDATE CASCADE ON DELETE RESTRICT, "ctime" TIMESTAMP WITH TIME ZONE DEFAULT NOW(), PRIMARY KEY("id", "revision") ); 

для хранения сообщений, и эта таблица:

 CREATE TABLE "post_state" ( "post_id" INTEGER NOT NULL, "assembly_seat_id" INTEGER NOT NULL REFERENCES "assembly_seat" ("id") MATCH FULL ON UPDATE CASCADE ON DELETE RESTRICT, PRIMARY KEY("post_id") ); 

и я хочу, чтобы в поле post_id указывалось post(id) , как мне это сделать? Я пробовал со следующей фразой:

  "post_id" INTEGER NOT NULL UNIQUE, REFERENCES "post" ("id") MATCH SIMPLE ON UPDATE RESTRICT ON DELETE RESTRICT, 

но я получаю эту ошибку:

ОШИБКА: нет уникального ограничения соответствия заданным ключам для таблицы «post»,

Значения post_state(asembly_seat_id) не изменяются в этом случае.

Ограничение внешнего ключа может охватывать несколько столбцов . Вы можете просто добавить revision столбца в столбец post_state .

 CREATE TEMP TABLE post ( post_id serial NOT NULL ,revision integer NOT NULL DEFAULT 0 ,summary text NOT NULL ,description text NOT NULL ,user_id integer NOT NULL REFERENCES user (id) MATCH FULL ON UPDATE CASCADE ON DELETE RESTRICT ,post_type_id integer NOT NULL REFERENCES post_type (id) MATCH FULL ON UPDATE CASCADE ON DELETE RESTRICT ,ctime timestamptz DEFAULT NOW() ,PRIMARY KEY(post_id, revision) ); CREATE TEMP TABLE post_state ( post_id integer NOT NULL ,revision integer NOT NULL ,assembly_seat_id integer NOT NULL REFERENCES assembly_seat (id) MATCH FULL ON UPDATE CASCADE ON DELETE RESTRICT ,PRIMARY KEY(post_id, revision) ,FOREIGN KEY (post_id, revision) REFERENCES post (post_id, revision) ); 

Прочтите руководство по ограничениям внешнего ключа .

Я использую имя post_id для столбца первичного ключа в столбце таблицы. Не используйте id как имя столбца. Если вы присоединитесь к кучке таблиц, вы получите кучу столбцов всех имен id . К сожалению, у некоторых ORM с половиной остроумием есть привычка делать это.

В качестве альтернативы, может быть, лучше иметь уникальный post_id в таблице и добавить стол post_revision с отношением: 1 к post .