加入收藏 | 设为首页 | 会员中心 | 我要投稿 航空爱好网 (https://www.52kongjun.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

mysql怎样实现主外键约束

发布时间:2022-02-28 19:48:27 所属栏目:MySql教程 来源:互联网
导读:这篇文章将为大家详细讲解有关mysql如何实现主外键约束,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 mysql主键约束 主键(PRIMARY KEY)的完整称呼是主键约束,是 MySQL 中使用最为频繁的约束。一般情况下,为了便
  这篇文章将为大家详细讲解有关mysql如何实现主外键约束,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
 
  
  mysql主键约束
 
  主键(PRIMARY KEY)的完整称呼是“主键约束”,是 MySQL 中使用最为频繁的约束。一般情况下,为了便于 DBMS 更快的查找到表中的记录,都会在表中设置一个主键。
 
  1、在创建表时设置主键约束
 
  在 CREATE TABLE 语句中,通过 PRIMARY KEY 关键字来指定主键。
 
  在定义字段的同时指定主键,语法格式如下:
 
  <字段名> <数据类型> PRIMARY KEY [默认值]
  例 1
 
  在 test_db 数据库中创建 tb_emp3 数据表,其主键为 id,SQL 语句和运行结果如下。
 
  mysql> CREATE TABLE tb_emp3
      -> (
      -> id INT(11) PRIMARY KEY,
      -> name VARCHAR(25),
      -> deptId INT(11),
      -> salary FLOAT
      -> );
  Query OK, 0 rows affected (0.37 sec)
  mysql> DESC tb_emp3;
  +--------+-------------+------+-----+---------+-------+
  | Field  | Type        | Null | Key | Default | Extra |
  +--------+-------------+------+-----+---------+-------+
  | id     | int(11)     | NO   | PRI | NULL    |       |
  | name   | varchar(25) | YES  |     | NULL    |       |
  | deptId | int(11)     | YES  |     | NULL    |       |
  | salary | float       | YES  |     | NULL    |       |
  +--------+-------------+------+-----+---------+-------+
  4 rows in set (0.14 sec)
  或者是在定义完所有字段之后指定主键,语法格式如下:
 
  [CONSTRAINT <约束名>] PRIMARY KEY [字段名]
  例 2
 
  在 test_db 数据库中创建 tb_emp4  数据表,其主键为 id,SQL 语句和运行结果如下。
 
  mysql> CREATE TABLE tb_emp4
      -> (
      -> id INT(11),
      -> name VARCHAR(25),
      -> deptId INT(11),
      -> salary FLOAT,
      -> PRIMARY KEY(id)
      -> );
  Query OK, 0 rows affected (0.37 sec)
  mysql> DESC tb_emp4;
  +--------+-------------+------+-----+---------+-------+
  | Field  | Type        | Null | Key | Default | Extra |
  +--------+-------------+------+-----+---------+-------+
  | id     | int(11)     | NO   | PRI | NULL    |       |
  | name   | varchar(25) | YES  |     | NULL    |       |
  | deptId | int(11)     | YES  |     | NULL    |       |
  | salary | float       | YES  |     | NULL    |       |
  +--------+-------------+------+-----+---------+-------+
  4 rows in set (0.14 sec)
  2、在修改表时添加主键约束
 
  主键约束不仅可以在创建表的同时创建,也可以在修改表时添加。但是需要注意的是,设置成主键约束的字段中不允许有空值。
 
  在修改数据表时添加主键约束的语法格式如下:
 
  ALTER TABLE <数据表名> ADD PRIMARY KEY(<字段名>);
  查看 tb_emp2 数据表的表结构,SQL 语句和运行结果如下所示。
 
  mysql> DESC tb_emp2;
  +--------+-------------+------+-----+---------+-------+
  | Field  | Type        | Null | Key | Default | Extra |
  +--------+-------------+------+-----+---------+-------+
  | id     | int(11)     | NO   |     | NULL    |       |
  | name   | varchar(30) | YES  |     | NULL    |       |
  | deptId | int(11)     | YES  |     | NULL    |       |
  | salary | float       | YES  |     | NULL    |       |
  +--------+-------------+------+-----+---------+-------+
  4 rows in set (0.14 sec)
  例 3
 
  修改数据表 tb_emp2,将字段 id 设置为主键,SQL 语句和运行结果如下。
 
  mysql> ALTER TABLE tb_emp2
      -> ADD PRIMARY KEY(id);
  Query OK, 0 rows affected (0.94 sec)
  Records: 0  Duplicates: 0  Warnings: 0
  mysql> DESC tb_emp2;
  +--------+-------------+------+-----+---------+-------+
  | Field  | Type        | Null | Key | Default | Extra |
  +--------+-------------+------+-----+---------+-------+
  | id     | int(11)     | NO   | PRI | NULL    |       |
  | name   | varchar(30) | YES  |     | NULL    |       |
  | deptId | int(11)     | YES  |     | NULL    |       |
  | salary | float       | YES  |     | NULL    |       |
  +--------+-------------+------+-----+---------+-------+
  4 rows in set (0.12 sec)
  通常情况下,当在修改表时要设置表中某个字段的主键约束时,要确保设置成主键约束的字段中值不能够有重复的,并且要保证是非空的。否则,无法设置主键约束。
 
  
  定义外键时,需要遵守下列规则:
 
  主表必须已经存在于数据库中,或者是当前正在创建的表。如果是后一种情况,则主表与从表是同一个表,这样的表称为自参照表,这种结构称为自参照完整性。
  必须为主表定义主键。
  主键不能包含空值,但允许在外键中出现空值。也就是说,只要外键的每个非空值出现在指定的主键中,这个外键的内容就是正确的。
  在主表的表名后面指定列名或列名的组合。这个列或列的组合必须是主表的主键或候选键。
  外键中列的数目必须和主表的主键中列的数目相同。
  外键中列的数据类型必须和主表主键中对应列的数据类型相同。

(编辑:航空爱好网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!