MySQL的外键约束
一、MySQL外键
外键表示一个表中的一个字段被另一个表中的一个字段引用。外键对相关表中的数据造成了限制,使MySQL的能够保持参照完整性。只有InnoDB类型的表才可以使用外键。
1、外键的好处
可以使得两张表关联,保证数据的一致性和实现一些级联操作。
2、外键的作用
保持数据一致性,完整性,主要目的是控制存储在外键表中的数据。 使两张表形成关联,外键只能引用外表中的列的值!
3、建立外键的前提
两个表必须是InnoDB表类型。
使用在外键关系的域必须为索引型(Index)。
使用在外键关系的域必须与数据类型相似
4、创建的步骤
指定主键关键字: foreign key(列名)
引用外键关键字: references <外键表名>(外键列名)
5、事件触发限制
on delete和on update , 可设参数cascade(跟随外键改动), restrict(限制外表中的外键改动),set Null(设空值),set Default(设默认值),[默认]no action
二、创建外键
MySQL创建外键语法:
CONSTRAINT constraint_name
FOREIGN KEY foreign_key_name (columns)
REFERENCES parent_table(columns)
ON DELETE action
ON UPDATE action
下面我们来更详细的查看上面语法:
-
CONSTRAINT
子句允许您为外键约束定义约束名称。如果省略它,MySQL将自动生成一个名称。 -
FOREIGN KEY
子句指定子表中引用父表中主键列的列。您可以在FOREIGN KEY
子句后放置一个外键名称,或者让MySQL为您创建一个名称。请注意,MySQL会自动创建一个具有foreign_key_name
名称的索引。 -
REFERENCES
子句指定父表及其子表中列的引用。 在FOREIGN KEY
和REFERENCES
中指定的子表和父表中的列数必须相同。 -
ON DELETE
子句允许定义当父表中的记录被删除时,子表的记录怎样执行操作。如果省略ON DELETE
子句并删除父表中的记录,则MySQL将拒绝删除子表中相关联的数据。此外,MySQL还提供了一些操作,以便您可以使用其他选项,例如ON DELETE CASCADE
,当删除父表中的记录时,MySQL可以删除子表中引用父表中记录的记录。 如果您不希望删除子表中的相关记录,请改用ON DELETE SET NULL
操作。当父表中的记录被删除时,MySQL会将子表中的外键列值设置为NULL
,条件是子表中的外键列必须接受NULL
值。 请注意,如果使用ON DELETE NO ACTION
或ON DELETE RESTRICT
操作,MySQL将拒绝删除。 -
ON UPDATE
子句允许指定在父表中的行更新时,子表中的行会怎样执行操作。当父表中的行被更新时,可以省略ON UPDATE
子句让MySQL拒绝对子表中的行的任何更新。ON UPDATE CASCADE
操作允许您执行交叉表更新,并且当更新父表中的行时,ON UPDATE SET NULL
操作会将子表中行中的值重置为NULL
值。ON UPDATE NO ACTION
或UPDATE RESTRICT
操作拒绝任何更新。
三、MySQL创建表外键示例
以下示例创建一个dbdemo数据库和两个表:categories
和products
。每个类别都有一个或多个产品,每个产品只属于一个类别。 products
表中的cat_id
字段被定义为具有UPDATE ON CASCADE
和DELETE ON RESTRICT
操作的外键。
CREATE DATABASE IF NOT EXISTS dbdemo;
USE dbdemo;
CREATE TABLE categories(
cat_id int not null auto_increment primary key,
cat_name varchar(255) not null,
cat_description text
) ENGINE=InnoDB;
CREATE TABLE products(
prd_id int not null auto_increment primary key,
prd_name varchar(355) not null,
prd_price decimal,
cat_id int not null,
FOREIGN KEY fk_cat(cat_id)
REFERENCES categories(cat_id)
ON UPDATE CASCADE
ON DELETE RESTRICT
)ENGINE=InnoDB;
四、添加外键
1、MySQL添加外键语法
要将外键添加到现有表中,请使用ALTER TABLE语句与上述外键定义语法:
ALTER table_name
ADD CONSTRAINT constraint_name
FOREIGN KEY foreign_key_name(columns)
REFERENCES parent_table(columns)
ON DELETE action
ON UPDATE action;
2、MySQL添加外键示例
现在,我们添加一个名为vendors的新表,并更改products表以包含供应商ID字段:
USE dbdemo;
CREATE TABLE vendors(
vdr_id int not null auto_increment primary key,
vdr_name varchar(255)
)ENGINE=InnoDB;
ALTER TABLE products
ADD COLUMN vdr_id int not null AFTER cat_id;
要在products表中添加外键,请使用以下语句:
ALTER TABLE products
ADD FOREIGN KEY fk_vendor(vdr_id)
REFERENCES vendors(vdr_id)
ON DELETE NO ACTION
ON UPDATE CASCADE;
现在,products表有两个外键,一个是引用categories表,另一个是引用vendors表。
五、删除MySQL外键
您还可以使用ALTER TABLE语句将外键删除,如下语句:
ALTER TABLE table_name
DROP FOREIGN KEY constraint_name;
在上面的声明中:
- 首先,指定要从中删除外键的表名称。
- 其次,将约束名称放在
DROP FOREIGN KEY
子句之后。
请注意:constraint_name
是在创建或添加外键到表时指定的约束的名称。 如果省略它,MySQL会为您生成约束名称。要获取生成的表的约束名称,请使用SHOW CREATE TABLE
语句,如下所示:
SHOW CREATE TABLE table_name;
例如,要查看products表的外键,请使用以下语句:
SHOW CREATE TABLE products;
以下是语句的输出:
CREATE TABLE products (
prd_id int(11) NOT NULL AUTO_INCREMENT,
prd_name varchar(355) NOT NULL,
prd_price decimal(10,0) DEFAULT NULL,
cat_id int(11) NOT NULL,
vdr_id int(11) NOT NULL,
PRIMARY KEY (prd_id),
KEY fk_cat (cat_id),
KEY fk_vendor(vdr_id),
CONSTRAINT products_ibfk_2
FOREIGN KEY (vdr_id)
REFERENCES vendors (vdr_id)
ON DELETE NO ACTION
ON UPDATE CASCADE,
CONSTRAINT products_ibfk_1
FOREIGN KEY (cat_id)
REFERENCES categories (cat_id)
ON UPDATE CASCADE
) ENGINE=InnoDB;
products
表有两个外键约束:products_ibfk_1
和products_ibfk_2
。
可以使用以下语句删除products表的外键:
ALTER TABLE products
DROP FOREIGN KEY products_ibfk_1;
ALTER TABLE products
DROP FOREIGN KEY products_ibfk_2;
六、MySQL禁用外键检查
有时,因为某种原因需要禁用外键检查(例如将CSV文件中的数据导入表中)非常有用。 如果不禁用外键检查,则必须以正确的顺序加载数据,即必须首先将数据加载到父表中,然后再将数据加载导入到子表中,这可能是乏味的。 但是,如果禁用外键检查,则可以按任何顺序加载导入数据。
除非禁用外键检查,否则不能删除由外键约束引用的表。删除表时,还会删除为表定义的任何约束。
要禁用外键检查,请使用以下语句:
SET foreign_key_checks = 0;
当然,可以使用以下语句启用它:
SET foreign_key_checks = 1;
七、注意
1、删除带有外键约束的表
创建department表:
create table department(
dept_name varchar(20),
budget int,
descript varchar(20),
primary key(dept_name)
创建course表:
create table course(
course_id varchar(20),
deptnames varchar(20),
credits int,
foreign key(deptnames) references department(dept_name));
course
表的外键deptnames
指向department
表的dept_name
。若要删除department
,course
这两个表,则必须先删除course
表,再删除department
表。或者是把外键删除掉后,两张表的删除顺序就不分先后了。
上一篇: 插入记录时,提前获取记录自增id
下一篇: npm常用命令