首页 >数据库 >mysql教程 > 正文

mysql怎么增加外键

原创2020-09-16 18:00:2005941

mysql增加外键的方法:1、在CREATE TABLE语句中,通过FOREIGN KEY关键字来添加外键;2、在ALTER TABLE语句中,通过ADD和FOREIGN KEY关键字来添加外键。

推荐课程:MySQL教程

MySQL 外键约束(FOREIGN KEY)是表的一个特殊字段,经常与主键约束一起使用。对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表(父表),外键所在的表就是从表(子表)。

外键用来建立主表与从表的关联关系,为两个表的数据建立连接,约束两个表中数据的一致性和完整性。比如,一个水果摊,只有苹果、桃子、李子、西瓜等 4 种水果,那么,你来到水果摊要买水果就只能选择苹果、桃子、李子和西瓜,其它的水果都是不能购买的。

主表删除某条记录时,从表中与之对应的记录也必须有相应的改变。一个表可以有一个或多个外键,外键可以为空值,若不为空值,则每一个外键的值必须等于主表中主键的某个值。

定义外键时,需要遵守下列规则:

  • 主表必须已经存在于数据库中,或者是当前正在创建的表。如果是后一种情况,则主表与从表是同一个表,这样的表称为自参照表,这种结构称为自参照完整性。

  • 必须为主表定义主键。

  • 主键不能包含空值,但允许在外键中出现空值。也就是说,只要外键的每个非空值出现在指定的主键中,这个外键的内容就是正确的。

  • 在主表的表名后面指定列名或列名的组合。这个列或列的组合必须是主表的主键或候选键。

  • 外键中列的数目必须和主表的主键中列的数目相同。

  • 外键中列的数据类型必须和主表主键中对应列的数据类型相同。

在创建表时设置外键约束

在 CREATE TABLE 语句中,通过 FOREIGN KEY 关键字来指定外键,具体的语法格式如下:

[CONSTRAINT <外键名>] FOREIGN KEY 字段名 [,字段名2,…]
REFERENCES <主表名> 主键列1 [,主键列2,…]

例 1

为了展现表与表之间的外键关系,本例在 test_db 数据库中创建一个部门表 tb_dept1,表结构如下表所示。

1.png

创建 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。

注意:从表的外键关联的必须是主表的主键,且主键和外键的数据类型必须一致。例如,两者都是 INT 类型,或者都是 CHAR 类型。如果不满足这样的要求,在创建从表时,就会出现“ERROR 1005(HY000): Can't create table”错误。

在修改表时添加外键约束

外键约束也可以在修改表时添加,但是添加外键约束的前提是:从表中外键列中的数据必须与主表中主键列中的数据一致或者是没有数据。

在修改数据表时添加外键约束的语法格式如下:

ALTER TABLE <数据表名> ADD CONSTRAINT <外键名>
FOREIGN KEY(<列名>) REFERENCES <主表名> (<列名>);

例 2

修改数据表 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)

注意:在为已经创建好的数据表添加外键约束时,要确保添加外键约束的列的值全部来源于主键列,并且外键列不能为空。

删除外键约束

当一个表中不需要外键约束时,就需要从表中将其删除。外键一旦删除,就会解除主表和从表间的关联关系。

删除外键约束的语法格式如下所示:

ALTER TABLE <表名> DROP FOREIGN KEY <外键约束名>;

例 3

删除数据表 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怎么增加外键的详细内容,更多请关注php中文网其它相关文章!

php中文网最新课程二维码
  • 相关标签:mysql
  • 本文原创发布php中文网,转载请注明出处,感谢您的尊重!
  • 相关文章

    相关视频


    网友评论

    文明上网理性发言,请遵守 新闻评论服务协议

    我要评论
  • mysql的方法有:1、在属性值后面直接添;2、在sql语句末端添;3、使用fk以及在建表后添;4、在建表后添
    mysql不让删是因为在创建后,会自动建一个同名的索引,而在删除时,这个同名索引如果没被删,则mysql认为仍然存在,那mysql会在show keys命令里继续显示
    mysql的原因:1、数据记录本身被存于主索引的叶子节点上;2、mysql会根据其主将其插入适当的节点和位置;3、表使用自,在每次插入新的记录时,记录会顺序添到当前索引节点的后续位置。
    MySQL中有很多类型的自ID,每个自ID都设置了初始值,然后按照一定的步长,只要定义了字节长度,那就会有上限,如果达到上限再次添,则会报主冲突错误,解决方法可以考虑使用“bigint
    使用MySQL的方法:1、两个表必须是InnoDB表类型;2、使用在关系的域必须为索引型Index;3、使用在关系的域必须与数据类型相似。
    网站内容不收录的解决方法:1、链,吸引蜘蛛对网站进行索引抓取;2、提高文章质量,文章相关度;3、词相关度,注意关词密度。
    mysql约束的写法:【[CONSTRAINT <名>] FOREIGN KEY 字段名 REFERENCES <主表名> 主列1】。
    mysql约束的创建语法是:【[CONSTRAINT <名>] FOREIGN KEY 字段名 REFERENCES <主表名> 主列1】。
    链需要注意的是:1、链一定要相关;2、链一定要亲手发,不可以买卖链、群发链;3、要发高质量的链;4、发链一定要自然;5、链需要不断地
    mysql有必要升级到第8版本,相较于之前的版本,mysql8多种新特性,同时也提高了软件各方面的速度。除此之,mysql8还了开窗函数,可以让用户获得更好的使用体验。
    mysql中自的作用有:1、数据库自动编号,而且是长,按顺序存放;2、有利于检索;3、占用空间小,在程序中传递方便;4、通过非系统记录时,不用指定该字段,没有主重复问题。
    在php中可以使用foreach来为数组值对,其代码语法为“foreach ($a as &$item) {$item['b'] = "value";}”。
    在ThinkPHP中,关联模型更类似一种mysql中的约束,但是约束更安全,缺点却是在写sql语句的时候不方便,ThinkPHP解决了这个问题.
    mysql中可以在创建表时添复合主,其语法规则是“PRIMARY KEY [字段1,字段2,…,字段n]”,表示主由多个字段联合组成。
    mysql在当前时间一小时的方法:可以利用date_add()函数来实现。
    在ThinkPHP中关联模型更类似一种mysql中的约束,但是约束更安全,缺点却是在写sql语句的时候不方便,ThinkPHP很好得解决了这个问题。
    MySQL在5.5.3之后了这个utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode。
    MySQL在5.5.3之后了这个utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode。
    mysql索引类型:1、主类型,关字不能重复,也不能为null;2、唯一索引,关字不能重复,同时唯一约束;3、普通索引,index()对关字没有要求;4、全文索引。
    phpcms行距的方法是:1、下载lineheight插件;2、编辑config.js文件,如【config.extraPlugins='capture,videoforpc,flashplayer

    专题推荐

    作者信息
    推荐视频教程
  • MySQL数据管理之备份恢复案例解析视频教程MySQL数据管理之备份恢复案例解析视频教程
  • MySql参考手册MySql参考手册
  • PHP+Jquery+Mysql实现省市县三级联动PHP+Jquery+Mysql实现省市县三级联动
  • MySQL权威开发指南(教程)MySQL权威开发指南(教程)
  • 视频教程分类