2016-11-25 109 views
0

我新的SQL,我有点挣扎 -了解违反约束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) 
); 

我遇到2个约束违规,第一个是,我能够与difficulty 0,或旅行用difficulty 7添加Tripsduration 2(期望约束 - 持续时间的旅程超过6具有至少3个难度) -

enter image description here

而第二次违规行为是我能够添加Offer s,其中包含tnumcid甚至不存在。

+1

“(难度<= 6或持续时间> = 3)” - 您能否想到一个数字无法通过此测试? –

+1

@DavidAldridge是你可能想要的'(持续时间<= 6 AND难度> = 3)' –

+0

你们是对的,但仍然如你所说修正后,约束仍然违反 –

回答

1

如果我们修改你的约束为逻辑上等同,

difficulty INTEGER not NULL 
    CHECK(difficulty between 1 and 6), 
    CHECK(difficulty between 3 and 6) 

很清楚,第二个约束控制,因为任何3 & 6之间也是1 & 之间6.

我'能够添加难度的旅行0

这是不可能的波夫。不过,使用andor,很容易混淆并描述一个约束,而不是你想要的。

关于外键约束,SQL现在看起来是正确的,但是@Gordon Linoff的回答表明您的文章的原始版本包含的错误不会正确约束Offer

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