【发布时间】:2010-03-01 02:39:23
【问题描述】:
我有两张表:deck(id) 和 card(deck,color,value)
套牌有这些限制:
CHECK (fifty_two_cards_deck(id))-
PRIMARY KEY (id)CREATE FUNCTION Fifth_two_cards_deck(deck integer) RETURNS boolean 语言 sql 稳定 STRICT AS $$ SELECT COUNT(*)=52 FROM card 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 错误:
错误:关系“deck”的新行 违反检查约束 "fifty_two_cards_deck"
In 语句:开始事务; 插入“公共”。“甲板”(“id”) 价值观 (nextval('deck_id_seq'::regclass)); INSERT INTO "public"."card" ("deck", "颜色", "值") 值 ('1', enum_first(null::Suit), enum_first(null::Symbol));
结束交易
如何在不移除约束的情况下解决这个问题?
编辑:解决方案
感谢 Magnus Hagander 我让它像这样工作(在设置外键可延迟之后):
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
【问题讨论】:
标签: postgresql transactions constraints