了解SQL中的约束违规

时间:2016-11-25 18:18:56

标签: sql postgresql

我是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次) -

enter image description here

第二个违规行为是,我可以添加由Offertnum组成的甚至不存在的cid

2 个答案:

答案 0 :(得分:1)

我认为tripoffer的外键引用错误:

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的旅程

上述情况不可能实现。但是,使用andor,很容易纠结并描述除了您想要的约束之外的约束。

关于外键约束,现在的SQL看起来是正确的,但是@Gordon Linoff的回答表明你的帖子的原始版本包含了没有正确约束的错误Offer