2013-08-24 4 views
1

Я изучаю SQL, и я застрял в одном из вопросов обзора и не могу найти ответ в учебнике. Когда вы удаляете каскад 'SQL - Удалить Каскад используется с?

Что он' использовал '?

  • a. он используется вместе с ограничением первичного ключа
  • b. он используется вместе с уникальным ограничением
  • c. он используется вместе с ссылочным ограничением
  • d. он используется вместе с типом ограничений

Я хочу сказать, что первичный ключ, потому что он будет определять правильный кортеж, когда он каскадирует? Правильно/неправильно, я просто не знаю, какой из них прав.

Спасибо.

+1

'DELETE CASCADE' используется с колонками' Foreign Key', поэтому 'C' является правильным здесь. – MarcinJuraszek

+0

Продумайте это так: для чего-то каскадного, это подразумевает, что оно затрагивает более одного элемента/узла/элемента/независимо. 'ON DELETE CASCADE' подразумевает, что удаление вызывает каскадное действие на другой элемент/узел/элемент/что угодно. Таким образом, правильный ответ - 'C', реляционные ограничения (внешние ключи). Строка удаляется, а связанные строки в других таблицах (или той же таблице) через ограничения FK также удаляются, поскольку общий элемент между ними больше не существует. –

ответ

1

Она удаляет все записи, которые имеют FKs к этой записи.

See Fiddle


CREATE TABLE foo (
    id serial, 
    num int, 
    PRIMARY KEY (id) 
); 
INSERT INTO foo(num) VALUES(1),(2),(3),(4); 

CREATE TABLE bar ( 
    foo_id bigint unsigned, 
    FOREIGN KEY (foo_id) REFERENCES foo (id) ON DELETE CASCADE 
); 
INSERT INTO bar(foo_id) VALUES (1),(2),(3),(4); 

DELETE FROM bar WHERE foo_id = 3; -- notice 3 is only removed from bar 
DELETE FROM foo WHERE id = 2;  -- notice 2 is removed from both foo and bar 

Когда запись из foo удаляется, любые ограничения, которые ссылаются на ключ этой записи и имеют delete cascade указанный, также будут удалены. Без этой спецификации, когда запись в foo будет удалена, база данных отправит сообщение об ошибке, если в конце транзакции все еще существуют какие-либо внешние зависимости.

+0

Он был опущен, потому что ваш первоначальный ответ подразумевал, что OP был правильным, если DELETE CASCADE используется с PK. Каскадное удаление используется с FK, которые являются синонимами для ссылочных ограничений. Вы все еще смутно подразумеваете, что предположение OP было правильным. –

+1

@MichaelBerkowski Я вижу, несмотря на указание, что это происходит только для 'FKs' - я удалю' Right', поскольку это неоднозначно и вводит в заблуждение; спасибо – vol7ron

Смежные вопросы