Я новичок в 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

И второе нарушение, это то, что я могу добавить Offer, которые состоят из tnum и cid, которых даже не существует.

0
Alex Goft 25 Ноя 2016 в 21:18

2 ответа

Лучший ответ

Если мы перефразируем ваше ограничение как логически эквивалентное,

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

Становится ясно, что контролирует второе ограничение, потому что все, что находится между 3 и 6, также находится между 1 и 6.

Я могу добавить Поездки с трудом 0

Это было бы невозможно с вышеуказанным. Однако, используя and и or, легко запутаться и описать ограничение, отличное от того, что вы намереваетесь.

Что касается ограничений внешнего ключа, SQL в его нынешнем виде выглядит правильным, но ответ @Gordon Linoff указывает, что исходная версия вашего сообщения содержала ошибки, которые не могли бы правильно ограничить Offer.

1
James K. Lowden 25 Ноя 2016 в 21:38

Я думаю, что ваша ссылка на внешний ключ для 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
Gordon Linoff 25 Ноя 2016 в 18:28