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: 0 mysql> SHOW CREATE TABLE tb_emp2\G *************************** 1. row *************************** Table: tb_emp2 Create 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=gb2312 1 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: 0 mysql> SHOW CREATE TABLE tb_emp2\G *************************** 1. row *************************** Table: tb_emp2 Create 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=gb2312 1 row in set (0.00 sec)
能够看到,tb_emp2 中已不存在 FOREIGN KEY,原有的称号为 fk_emp_dept 的外键束缚删除胜利。
以上就是MySQL怎样设置外键束缚?的细致内容,更多请关注ki4网别的相干文章!