Нарушение ограничения - SQL Server - PullRequest
0 голосов
/ 07 января 2019

У меня есть инструкции по созданию двух таблиц:

CREATE TABLE S
(
    c INT PRIMARY KEY,
    d INT
);

CREATE TABLE R
(
    a INT PRIMARY KEY,
    b INT REFERENCES S(c)
);

R(a,b) имеет 4 строки: (0,4),(1,5),(2,4),(3,5)

S(c,d) также имеет 4 строки: (2,10),(3,11),(4,12),(5,13)

Учитывая эту информацию, мне нужно выбрать, какая из следующих модификаций НЕ будет отклонена из-за нарушения ограничения (синтаксис здесь не рассматривается):

Запрос (а)

INSERT INTO S
VALUES (3, 3)

Запрос (б)

INSERT INTO S
VALUES (4, 4)

Запрос (с)

DELETE (5, 13) FROM S

Запрос (d)

DELETE (4, 12) FROM S

Мне трудно ответить на этот вопрос, так как я считаю, что все варианты будут отклонены.

Я не могу вставить (3, 3) или (4, 4) в S, потому что c является первичным ключом, поэтому я не могу вставить значения, которые будут повторяться в c.

И я не могу удалить (5, 13) и (4, 12) из S, потому что столбец b в таблице R указывает на столбец c, если эти строки удаляются, столбец b будет указывать на то, что не существует что приведет к ошибке.

Я что-то упустил?

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Я предполагаю, что это какой-то экзаменационный вопрос, так что я собираюсь больше сосредоточиться на том, как прийти к ответу, а не просто дать вам ответ.

У вас есть два ограничения, о которых нужно беспокоиться.

Таблица S имеет ограничение первичного ключа для столбца C. Таблица R имеет ограничение внешнего ключа для столбца B.

Учитывая ограничение первичного ключа, вы получите сообщение об ошибке, если попытаетесь INSERT в S со значением C, которое уже существует.

Проверьте свои операторы INSERT, чтобы увидеть, существует ли какое-либо из значений, которые пытаются вставить в C, уже. Если это сделать, они потерпят неудачу.

Учитывая ограничение внешнего ключа, вы получите сообщение об ошибке, если попытаетесь удалить из S любое значение C, на которое уже ссылается ограничение внешнего ключа в таблице R.

Изучите ваши DELETE заявления. Если какое-либо из удаляемых значений уже указано в R, эти операторы не будут выполнены.

0 голосов
/ 07 января 2019

Утверждения (а) и (б) непременно потерпят неудачу по указанной вами причине «они пытаются создать дубликаты первичных ключей»

Однако для операторов (c) и (d) они могут быть успешными или неуспешными в зависимости от ваших конфигураций ссылочной целостности следующим образом:

Ссылочная целостность имеет 4 варианта (Без действия, Каскад, Установить ноль, Установить по умолчанию)

Проверьте, как настроить ссылочную целостность

  1. «Бездействия» означает, что оба утверждения (b) и (c) завершатся неудачно, как вы ожидали.
  2. «Каскад» означает каскадную операцию удаления в ссылочную таблицу и удаления соответствующих записей. В вашем случае удаление S(5,13) приведет к удалению R(1,5), а удаление S(4,12) приведет к удалению R(0,4).
  3. «Set Null» означает установку ссылочного значения на Null. В вашем случае удаление S(5,13) обновит R(1,5) до R(1,Null), а удаление S(4,12) обновит R(0,4) до R(0,Null)
  4. «Установить значение по умолчанию» означает установку ссылочного значения на значение по умолчанию, если оно есть, или установку на Null, если значение по умолчанию не определено. В вашем случае произойдет сбой, так как вы не установили значение по умолчанию, но при условии, что вы установили значение по умолчанию от R(b) до 0, например, удаление S(5,13) приведет к обновлению R(1,5) до R(1,0) и удалению S(4,12) обновит R(0,4) до R(0,0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...