У меня две таблицы: колода (id) и карта (колода, цвет, значение)
колода имеет следующие ограничения:
CHECK (fifty_two_cards_deck(id))
PRIMARY KEY (id)
СОЗДАТЬ ФУНКЦИЮ пятьдесят_two_cards_deck (целое число колоды) ВОЗВРАЩАЕТ логическое значение ЯЗЫК sql СТАБИЛЬНЫЙ СТРОГ КАК $ $ SELECT COUNT (*) = 52 С карты WHERE deck = $ 1 $ $;
и у карты есть эти ограничения:
FOREIGN KEY (deck) REFERENCES deck(id)
PRIMARY KEY (deck, color, value)
Как я могу вставить новую колоду?
Я пробовал это:
begin transaction;
INSERT INTO "public"."deck" ("id") VALUES (nextval('deck_id_seq'::regclass));
INSERT INTO "public"."card" ("deck", "color", "value") VALUES ('1', enum_first(null::Suit), enum_first(null::Symbol));
end transaction
(я отредактировал fifty_two_cards_deck
, чтобы он был one_card_deck
для целей тестирования), но я получил эту ошибку:
Ошибка SQL:
ОШИБКА: новая строка для отношения «колода» нарушает ограничение проверки «пятьдесят_two_cards_deck»
В заявлении: начать транзакцию; ВСТАВИТЬ В "public". "Deck" ("id") VALUES (nextval ('deck_id_seq' :: regclass)); ВСТАВИТЬ В "public". "Card" ("колода", "цвет", "значение") VALUES ('1', enum_first (null :: Suit), enum_first (null :: Symbol));
завершить транзакцию
Как я могу решить эту проблему, не снимая ограничений?
РЕДАКТИРОВАТЬ: решение
спасибо Магнусу Хагандеру, я заставил его работать следующим образом (после установки отложенного внешнего ключа):
begin transaction;
SET CONSTRAINTS ALL DEFERRED;
INSERT INTO "public"."deck-card" ("deck", "position", "color", "value") VALUES (1, 0, enum_first(null::suit), enum_first(null::Symbol));
INSERT INTO "public"."deck" ("id") VALUES (1);
end transaction