我是SQL的新手,我有点挣扎 -
考虑下一段代码:
CREATE TABLE Trip
(
tnum INTEGER PRIMARY KEY,
location TEXT NOT NULL,
duration INTEGER DEFAULT(5),
difficulty INTEGER CHECK(difficulty > 0 AND difficulty < 7),
CHECK (difficulty <= 6 AND difficulty >= 3)
);
CREATE TABLE Company
(
cid INTEGER PRIMARY KEY,
diffiname TEXT NOT NULL,
estYear Integer NOT NULL
);
CREATE TABLE Offer
(
cid INTEGER,
tnum INTEGER,
FOREIGN KEY(cid) REFERENCES Company(cid),
FOREIGN KEY(tnum) REFERENCES Trip(tnum)
);
我遇到两个违规限制,第一个是我可以添加Trips
difficulty
0,或difficulty
7与duration
一起旅行2(期望的约束 - 持续时间超过6的旅行难以至少3次) -
第二个违规行为是,我可以添加由Offer
和tnum
组成的甚至不存在的cid
。
答案 0 :(得分:1)
我认为trip
上offer
的外键引用错误:
CREATE TABLE Offer
(
cid INTEGER,
tnum INTEGER,
FOREIGN KEY(cid) REFERENCES Company(cid),
FOREIGN KEY(tnum) REFERENCES Trip(cid)
--------------------------------------^ tnum
);
至于检查限制,我不明白这个意图:
CHECK (difficulty <= 6 OR duration >= 3)
您打算AND
吗?您打算AND difficulty >= 3
代替duration
吗?
答案 1 :(得分:1)
如果我们将您的约束重新定义为逻辑等效,
difficulty INTEGER not NULL
CHECK(difficulty between 1 and 6),
CHECK(difficulty between 3 and 6)
很明显,第二个约束控制,因为3和3之间的任何东西。 6也在1&amp; 1之间。 6.
我能够添加难度为0的旅程
上述情况不可能实现。但是,使用and
和or
,很容易纠结并描述除了您想要的约束之外的约束。
关于外键约束,现在的SQL看起来是正确的,但是@Gordon Linoff的回答表明你的帖子的原始版本包含了没有正确约束的错误Offer
。