您好,欢迎访问一九零五行业门户网

MySQL怎么设置外键约束?

mysql 外键约束(foreign key)用来在两个表的数据之间建立链接,它可以是一列或者多列。一个表可以有一个或多个外键。
外键对应的是参照完整性,一个表的外键可以为空值,若不为空值,则每一个外键的值必须等于另一个表中主键的某个值。
外键是表的一个字段,不是本表的主键,但对应另一个表的主键。定义外键后,不允许删除另一个表中具有关联关系的行。
外键的主要作用是保持数据的一致性、完整性。例如,部门表 tb_dept 的主键是 id,在员工表 tb_emp5 中有一个键 deptid 与这个 id 关联。主表(父表):对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表。从表(子表):对于两个具有关联关系的表而言,相关联字段中外键所在的表就是从表。
选取设置 mysql 外键约束的字段
定义一个外键时,需要遵守下列规则:
父表必须已经存在于数据库中,或者是当前正在创建的表。如果是后一种情况,则父表与子表是同一个表,这样的表称为自参照表,这种结构称为自参照完整性。
必须为父表定义主键。
主键不能包含空值,但允许在外键中出现空值。也就是说,只要外键的每个非空值出现在指定的主键中,这个外键的内容就是正确的。
在父表的表名后面指定列名或列名的组合。这个列或列的组合必须是父表的主键或候选键。
外键中列的数目必须和父表的主键中列的数目相同。
外键中列的数据类型必须和父表主键中对应列的数据类型相同。
在创建表时设置外键约束
在数据表中创建外键使用 foreign key 关键字,具体的语法规则如下:
[constraint <外键名>] foreign key 字段名 [,字段名2,…]references <主表名> 主键列1 [,主键列2,…]
其中:外键名为定义的外键约束的名称,一个表中不能有相同名称的外键;字段名表示子表需要添加外健约束的字段列;主表名即被子表外键所依赖的表的名称;主键列表示主表中定义的主键列或者列组合。
示例:为了展现表与表之间的外键关系,本例在 test_db 数据库中创建一个部门表 tb_dept1,表结构如下表所示。
创建 tb_dept1 的 sql 语句运行结果如下所示。
mysql> create table tb_dept1 -> ( -> id int(11) primary key, -> name varchar(22) not null, -> location varchar(50) -> );query ok, 0 rows affected (0.37 sec)
创建数据表 tb_emp6,并在表 tb_emp6 上创建外键约束,让它的键 deptid 作为外键关联到表 tb_dept1 的主键 id,输入的 sql 语句和运行结果如下所示。
mysql> create table tb_emp6 -> ( -> id int(11) primary key, -> name varchar(25), -> deptid int(11), -> salary float, -> constraint fk_emp_dept1 -> foreign key(deptid) references tb_dept1(id) -> );query ok, 0 rows affected (0.37 sec)mysql> desc tb_emp6;+--------+-------------+------+-----+---------+-------+| field | type | null | key | default | extra |+--------+-------------+------+-----+---------+-------+| id | int(11) | no | pri | null | || name | varchar(25) | yes | | null | || deptid | int(11) | yes | mul | null | || salary | float | yes | | null | |+--------+-------------+------+-----+---------+-------+4 rows in set (1.33 sec)
以上语句执行成功之后,在表 tb_emp6 上添加了名称为 fk_emp_dept1 的外键约束,外键名称为 deptid,其依赖于表 tb_dept1 的主键 id。
提示:关联指的是关系数据库中,相关表之间的联系。它是通过相同的属性或属性组来表示的。子表的外键必须关联父表的主键,且关联字段的数据类型必须匹配,如果类型不一样,则创建子表时会出现错误“error 1005(hy000):can't create table'database.tablename'(errno:150)”。
在修改表时添加外键约束
在修改数据表时添加外键约束的语法规则为:
alter table <数据表名> add constraint <索引名>foreign key(<列名>) references <主表名> (<列名>);
示例:修改数据表 tb_emp2,将字段 deptid 设置为外键,与数据表 tb_dept1 的主键 id 进行关联,输入的 sql 语句和运行结果如下所示。
mysql> alter table tb_emp2 -> add constraint fk_tb_dept1 -> foreign key(deptid) -> references tb_dept1(id);query ok, 0 rows affected (1.38 sec)records: 0 duplicates: 0 warnings: 0mysql> show create table tb_emp2\g*************************** 1. row *************************** table: tb_emp2create table: create table `tb_emp2` ( `id` int(11) not null, `name` varchar(30) default null, `deptid` int(11) default null, `salary` float default null, primary key (`id`), key `fk_tb_dept1` (`deptid`), constraint `fk_tb_dept1` foreign key (`deptid`) references `tb_dept1` (`id`)) engine=innodb default charset=gb23121 row in set (0.12 sec)
删除外键约束
对于数据库中定义的外键,如果不再需要,可以将其删除。外键一旦删除,就会解除主表和从表间的关联关系,mysql 中删除外键的语法格式如下:
alter table <表名> drop foreign key <外键约束名>;
示例:删除数据表 tb_emp2 中的外键约束 fk_tb_dept1,输入的 sql 语句和运行结果如下所示。
mysql> alter table tb_emp2 -> drop foreign key fk_tb_dept1;query ok, 0 rows affected (0.19 sec)records: 0 duplicates: 0 warnings: 0mysql> show create table tb_emp2\g*************************** 1. row *************************** table: tb_emp2create table: create table `tb_emp2` ( `id` int(11) not null, `name` varchar(30) default null, `deptid` int(11) default null, `salary` float default null, primary key (`id`), key `fk_tb_dept1` (`deptid`)) engine=innodb default charset=gb23121 row in set (0.00 sec)
可以看到,tb_emp2 中已经不存在 foreign key,原有的名称为 fk_emp_dept 的外键约束删除成功。
以上就是mysql怎么设置外键约束?的详细内容。
其它类似信息

推荐信息