Spec-Zone .ru
спецификации, руководства, описания, API
|
This section describes differences in the InnoDB storage engine' handling of foreign keys as compared with that of the MySQL Server.
Foreign key definitions for InnoDB
tables are subject to the following conditions:
InnoDB
permits a foreign key to reference any index
column or group of columns. However, in the referenced table, there must be an index where the
referenced columns are listed as the first columns in the same
order.
InnoDB
does not currently support foreign keys for tables with user-defined partitioning. This means that no
user-partitioned InnoDB
table may contain foreign key references or columns
referenced by foreign keys.
InnoDB
allows a foreign key constraint to reference a
non-unique key. This is an InnoDB
extension to
standard SQL.
Referential actions for foreign keys of InnoDB
tables are subject to the following
conditions:
While SET DEFAULT
is allowed by the MySQL Server, it
is rejected as invalid by InnoDB
. CREATE TABLE
and ALTER TABLE
statements using this clause are not allowed for InnoDB
tables.
If there are several rows in the parent table that have the same referenced key
value, InnoDB
acts in foreign key checks as if the other parent rows with
the same key value do not exist. For example, if you have defined a RESTRICT
type constraint, and there is a child row with several parent
rows, InnoDB
does not permit the deletion of any of those parent rows.
InnoDB
performs cascading operations through a
depth-first algorithm, based on records in the indexes corresponding to the foreign key constraints.
If ON UPDATE CASCADE
or ON
UPDATE SET NULL
recurses to update the same table it has
previously updated during the cascade, it acts like RESTRICT
. This means
that you cannot use self-referential ON UPDATE CASCADE
or ON UPDATE SET NULL
operations. This is to prevent infinite loops
resulting from cascaded updates. A self-referential ON DELETE SET NULL
, on
the other hand, is possible, as is a self-referential ON DELETE CASCADE
.
Cascading operations may not be nested more than 15 levels deep.
Like MySQL in general, in an SQL statement that inserts, deletes, or updates many
rows, InnoDB
checks UNIQUE
and FOREIGN KEY
constraints row-by-row. When performing foreign key checks,
InnoDB
sets shared row-level locks on child or parent records it has to
look at. InnoDB
checks foreign key constraints immediately; the check is
not deferred to transaction commit. According to the SQL standard, the default behavior should be
deferred checking. That is, constraints are only checked after the entire SQL
statement has been processed. Until InnoDB
implements
deferred constraint checking, some things will be impossible, such as deleting a record that refers to
itself using a foreign key.
You can obtain general information about foreign keys and their usage from querying the INFORMATION_SCHEMA.KEY_COLUMN_USAGE
table, and more information more specific to
InnoDB
tables can be found in the INNODB_SYS_FOREIGN
and INNODB_SYS_FOREIGN_COLS
tables, also in the INFORMATION_SCHEMA
database. See also Section 13.1.17.2, "Using FOREIGN KEY
Constraints".
In addition to SHOW ERRORS
, in the event of a foreign key error involving InnoDB
tables (usually Error 150 in the MySQL Server), you can obtain a detailed explanation of the most recent InnoDB
foreign key error by checking the output of SHOW ENGINE INNODB STATUS
.