Foreign Key Constraint in MySql
InnoDB
supports foreign key constraints. The syntax for a foreign key constraint definition in InnoDB
looks like this:
[CONSTRAINT [ |
index_name
represents a foreign key ID. If given, this is ignored if an index for the foreign key is defined explicitly. Otherwise, if creates an index for the foreign key, it uses
index_name
for the index name.
Foreign keys definitions are subject to the following conditions:
Both tables must be
tables and they must not be
TEMPORARY
tables.Corresponding columns in the foreign key and the referenced key must have similar internal data types inside
InnoDB
so that they can be compared without a type conversion. The size and sign of integer types must be the same. The length of string types need not be the same. For nonbinary (character) string columns, the character set and collation must be the same.InnoDB
requires indexes on foreign keys and referenced keys so that foreign key checks can be fast and not require a table scan. In the referencing table, there must be an index where the foreign key columns are listed as the first columns in the same order. Such an index is created on the referencing table automatically if it does not exist. (This is in contrast to some older versions, in which indexes had to be created explicitly or the creation of foreign key constraints would fail.)index_name
, if given, is used as described previously.InnoDB
allows 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 columns in the same order.Index prefixes on foreign key columns are not supported. One consequence of this is that
BLOB
andTEXT
columns cannot be included in a foreign key because indexes on those columns must always include a prefix length.If the
CONSTRAINT
clause is given, thesymbol
symbol
value must be unique in the database. If the clause is not given,InnoDB
creates the name automatically.
InnoDB
rejects any INSERT
or UPDATE
operation that attempts to create a foreign key value in a child table if there is no a matching candidate key value in the parent table. The action InnoDB
takes for any UPDATE
or DELETE
operation that attempts to update or delete a candidate key value in the parent table that has some matching rows in the child table is dependent on the specified using ON UPDATE
and ON DELETE
subclauses of the FOREIGN KEY
clause. When the user attempts to delete or update a row from a parent table, and there are one or more matching rows in the child table, InnoDB
supports five options regarding the action to be taken. If ON DELETE
or ON UPDATE
are not specified, the default action is RESTRICT
.
CASCADE
: Delete or update the row from the parent table and automatically delete or update the matching rows in the child table. BothON DELETE CASCADE
andON UPDATE CASCADE
are supported. Between two tables, you should not define severalON UPDATE CASCADE
clauses that act on the same column in the parent table or in the child table.Note
Currently, cascaded foreign key actions to not activate triggers.
SET NULL
: Delete or update the row from the parent table and set the foreign key column or columns in the child table toNULL
. This is valid only if the foreign key columns do not have theNOT NULL
qualifier specified. BothON DELETE SET NULL
andON UPDATE SET NULL
clauses are supported.If you specify a
SET NULL
action, make sure that you have not declared the columns in the child table asNOT NULL
.NO ACTION
: In standard SQL,NO ACTION
means no action in the sense that an attempt to delete or update a primary key value is not allowed to proceed if there is a related foreign key value in the referenced table.InnoDB
rejects the delete or update operation for the parent table.RESTRICT
: Rejects the delete or update operation for the parent table. SpecifyingRESTRICT
(orNO ACTION
) is the same as omitting theON DELETE
orON UPDATE
clause. (Some database systems have deferred checks, andNO ACTION
is a deferred check. In MySQL, foreign key constraints are checked immediately, soNO ACTION
is the same asRESTRICT
.)SET DEFAULT
: This action is recognized by the parser, butInnoDB
rejects table definitions containingON DELETE SET DEFAULT
orON UPDATE SET DEFAULT
clauses.
InnoDB
supports foreign key references within a table. In these cases, “child table records” really refers to dependent records within the same table.
Here is a simple example that relates parent
and child
tables through a single-column foreign key:
CREATE TABLE parent (id INT NOT NULL, PRIMARY KEY (id) ) ENGINE=INNODB; CREATE TABLE child (id INT, parent_id INT, INDEX par_ind (parent_id), FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE CASCADE ) ENGINE=INNODB; |
A more complex example in which a
product_order
table has foreign keys for two other tables. One foreign key references a two-column index in the product
table. The other references a single-column index in the customer
table:CREATE TABLE product (category INT NOT NULL, id INT NOT NULL, price DECIMAL, PRIMARY KEY(category, id)) ENGINE=INNODB; CREATE TABLE customer (id INT NOT NULL, PRIMARY KEY (id)) ENGINE=INNODB; CREATE TABLE product_order (no INT NOT NULL AUTO_INCREMENT, product_category INT NOT NULL, product_id INT NOT NULL, customer_id INT NOT NULL, PRIMARY KEY(no), INDEX (product_category, product_id), FOREIGN KEY (product_category, product_id) REFERENCES product(category, id) ON UPDATE CASCADE ON DELETE RESTRICT, INDEX (customer_id), FOREIGN KEY (customer_id) REFERENCES customer(id)) ENGINE=INNODB; |
source mysql.com