Spec-Zone .ru
спецификации, руководства, описания, API
|
Внешние ключи, которым позволяют, Вы перекрестно сослаться на связанные данные через таблицы, и ограничения внешнего ключа помогаете сохранить эти данные распространения непротиворечивыми.
MySQL поддерживает ON UPDATE
и ON DELETE
ссылки
внешнего ключа в CREATE TABLE
и ALTER
TABLE
операторы. Доступные справочные действия RESTRICT
(значение по
умолчанию), CASCADE
, SET NULL
, и NO ACTION
.
SET DEFAULT
также поддерживается MySQL Server, но в настоящий момент отклоняется как
недопустимый InnoDB
и NDB
.
Так как MySQL не поддерживает задержанную ограничительную проверку, NO ACTION
обрабатывается как RESTRICT
. Для точного синтаксиса, поддерживаемого MySQL для
внешних ключей, см. Раздел 13.1.17.2, "Используя FOREIGN KEY
Ограничения".
MATCH FULL
, MATCH PARTIAL
, и MATCH
SIMPLE
позволяются, но их использования нужно избежать, поскольку они заставляют MySQL Server
игнорировать любого ON DELETE
или ON UPDATE
пункт
используется в том же самом операторе. MATCH
опции не имеют никакого другого
эффекта в MySQL, который в действительности осуществляет MATCH SIMPLE
полный
рабочий день семантики.
MySQL требует, чтобы столбцы внешнего ключа были индексированы; если Вы составляете таблицу с ограничением внешнего ключа, но не индексируете на данном столбце, индексирование создается.
Можно получить информацию о внешних ключах от INFORMATION_SCHEMA.KEY_COLUMN_USAGE
таблица. Пример запроса против этой таблицы
показывают здесь:
mysql>SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, CONSTRAINT_NAME
>FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
>WHERE REFERENCED_TABLE_SCHEMA IS NOT NULL;
+--------------+---------------+-------------+-----------------+| TABLE_SCHEMA | TABLE_NAME | COLUMN_NAME | CONSTRAINT_NAME |+--------------+---------------+-------------+-----------------+| fk1 | myuser | myuser_id | f || fk1 | product_order | customer_id | f2 || fk1 | product_order | product_id | f1 |+--------------+---------------+-------------+-----------------+3 rows in set (0.01 sec)
Информация о внешних ключах на InnoDB
таблицы могут также быть найдены в INNODB_SYS_FOREIGN
и INNODB_SYS_FOREIGN_COLS
таблицы, в INFORMATION_SCHEMA
база данных.
В настоящий момент, только InnoDB
таблицы поддерживают внешние ключи. См. Раздел 5.4.5,"InnoDB
и
FOREIGN KEY
Ограничения", для информации, определенной для внешнего ключа,
поддерживают в InnoDB
.
Реализация MySQL внешних ключей отличается от стандарта SQL в следующих ключевых отношениях:
Если есть несколько строк в родительской таблице, у которых есть то же самое
значение ключа, на которое ссылаются, InnoDB
действия во внешнем ключе проверяют, как будто другие родительские строки с тем же самым значением ключа
не существуют. Например, если Вы определили a RESTRICT
введите ограничение,
и есть дочерняя строка с несколькими родительскими строками, InnoDB
не
разрешает удаление любой из тех родительских строк.
InnoDB
выполняет располагающиеся каскадом операции через алгоритм в
глубину, основанный на записях в индексирует соответствие ограничениям внешнего ключа.
A FOREIGN KEY
ограничение, которое ссылается не -UNIQUE
ключ не является стандартным SQL, а скорее InnoDB
расширение.
Если ON UPDATE CASCADE
или ON
UPDATE SET NULL
рекурсивно вызывает, чтобы обновить ту же самую
таблицу, которую это ранее обновило во время того же самого каскада, это действует как RESTRICT
. Это означает, что невозможно использовать самосправочный ON UPDATE CASCADE
или ON UPDATE SET NULL
операции. Это должно предотвратить бесконечные циклы, следующие из каскадных обновлений. Самосправочное
ON DELETE SET NULL
, с другой стороны, возможно, как самосправочное ON DELETE CASCADE
. Расположение каскадом операций не может быть вложено
больше чем 15 уровней глубоко.
В SQL-операторе, который вставляет, удаляет, или обновляет много строк, ограничения
внешнего ключа (как ограничения на уникальность данных) являются проверенной строкой строкой. Выполняя
проверки внешнего ключа, InnoDB
совместно использованные блокировки наборов на уровне строки на дочернем элементе или родительских
записях, которые это должно исследовать. MySQL сразу проверяет ограничения внешнего ключа; проверка не
задерживается к фиксации транзакции. Согласно стандарту SQL, поведение значения по умолчанию должно быть
задержано, проверяя. Таким образом, ограничения только проверяются после того, как весь SQL-оператор был обработан. Это означает, что не возможно
удалить строку, которая обращается к себе, используя внешний ключ.
Для получения информации, как InnoDB
внешние ключи отличаются от стандарта SQL, видят Раздел
5.4.5,"InnoDB
и FOREIGN KEY
Ограничения"
.