внешний ключ для ключа, не являющегося кандидатом, и каскад удаления - PullRequest
0 голосов
/ 09 июня 2011

У меня вопрос в два раза,

  1. во-первых, возможно ли создать в mysql внешний ключ от ссылочной таблицы к столбцу в ссылочной таблице, который не является ключом-кандидатом? Я попробовал это, используя конструктор схемы SQLYOG, и он создал это странным образом. Просто хочу подтвердить это с другими, прежде чем предположить, что это ошибка, возможно, с sqlyog или mysql на самом деле это позволяет.

пример:

столбцы таблицы:

ssn: первичный ключ

имя: ключ-кандидат (имена могут повторяться)

столбцы таблицы 2

id2: первичный ключ

name_referencing: внешний ключ для имени в таблице1 (возможен ли этот внешний ключ ??)

2. Если описанный выше случай возможен, что происходит, когда происходит «каскад удаления». То есть, если существуют одинаковые значения (в разных строках) столбца, на который есть ссылка, удаление дочернего элемента (в ссылках) происходит только при удалении последнего значения (из повторяющихся значений) в таблице, на которую делается ссылка?

1 Ответ

1 голос
/ 09 июня 2011
-- Create the tables
(anthony@localhost) [test]> create table foo (a int primary key, b int not null, index(b)) engine=innodb;
Query OK, 0 rows affected (0.33 sec)

create table bar (b int not null, constraint b_exists foreign key (b) references foo(b) on delete cascade) engine=innodb;
Query OK, 0 rows affected (0.40 sec)

Итак, MySQL фактически разрешает эту ситуацию.Weird.Oracle и PostgreSQL не будут (оба порождают ошибки), и я не верю, что стандарт SQL позволяет это (но не проверял, поэтому мог ошибаться там).Давайте посмотрим, как он это обрабатывает:

-- Fill foo
(anthony@localhost) [test]> insert into foo values (1,1);
Query OK, 1 row affected (0.11 sec)

(anthony@localhost) [test]> insert into foo values (2,1);
Query OK, 1 row affected (0.07 sec)

-- Check foreign key works:
(anthony@localhost) [test]> insert into bar values (1);
Query OK, 1 row affected (0.13 sec)

(anthony@localhost) [test]> insert into bar values (2);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`test`.`bar`, CONSTRAINT `b_exists` FOREIGN KEY (`b`) REFERENCES `foo` (`b`) ON DELETE CASCADE)

-- Delete

(anthony@localhost) [test]> delete from foo  where a = 1;
Query OK, 1 row affected (0.09 sec)

(anthony@localhost) [test]> select * from bar;
Empty set (0.00 sec)

Итак, MySQL удаляет строку из ссылочной таблицы.По крайней мере, в 5.1.49.

...