详解MySQL的外键约束

创建表格

首先登录mysql,如

mysql -uroot -ppassword

打开一个数据库,如

mysql>use db1;

创建一个父表,我们命名为province,如

mysql> create table province (
    -> id smallint auto_increment key,
    -> name varchar(10) NOT NULL
    -> );

创建一个子表,命名为student,其中其pid引用来自province的id,如

mysql> create table student (
    -> id smallint primary key,
    -> name varchar(10) NOT NULL,
    -> pid smallint,
    -> foreign key(pid) references province(id)
    -> );

注意,此时pid的类型一定要与id的类型一致,若为数字,则要完全一致;若为字符,字符个数可以不一致。此时,id称为参照键。

查看自动索引

接下来,我们查看一下两个表是否已经创建成功及其成员,如

mysql> show columns in student;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | smallint(6) | NO   | PRI | NULL    |       |
| name  | varchar(10) | NO   |     | NULL    |       |
| pid   | smallint(6) | YES  | MUL | NULL    |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

mysql> show columns in province;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | smallint(6) | NO   | PRI | NULL    | auto_increment |
| name  | varchar(10) | NO   |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)

再看一下两个表的自动索引情况,如

mysql> show indexes from province\G;
*************************** 1. row ***************************
        Table: province
   Non_unique: 0
     Key_name: PRIMARY
 Seq_in_index: 1
  Column_name: id
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: 
   Index_type: BTREE
      Comment: 
Index_comment: 
1 row in set (0.00 sec)
mysql> show indexes from student\G;
*************************** 1. row ***************************
        Table: student
   Non_unique: 0
     Key_name: PRIMARY
 Seq_in_index: 1
  Column_name: id
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: 
   Index_type: BTREE
      Comment: 
Index_comment: 
*************************** 2. row ***************************
        Table: student
   Non_unique: 1
     Key_name: pid
 Seq_in_index: 1
  Column_name: pid
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment: 
Index_comment: 
2 rows in set (0.00 sec)

因而,我们看到student表中pid也已经创建了自动索引了。

外键约束的参照操作

外键约束主要有以下几大类:

cascade:从父表删除或更新且自动删除或更新字表中的匹配的内容;

set null:从父表删除或更新且子表中相匹配的内容设置为NULL,使用此功能必须保证字表列没有指定为NOT NULL;

restrict:拒绝对父表的删除或更新操作;

no action:标准SQL关键字,在mysql中与restrict相同;

下面再创建一个新表来说明情况,先删除之前的student表,如

mysql> drop table student;
Query OK, 0 rows affected (0.13 sec)

mysql> show tables;
+-----------------------+
| Tables_in_zzw_test_db |
+-----------------------+
| province              |
| tb1                   |
+-----------------------+
2 rows in set (0.00 sec)

接下来,重新创建一个student表,并且指定外键约束为cascade,如

mysql>  create table student (                                                                                                                           
    -> id smallint primary key,
    -> name varchar(10) NOT NULL,
    -> pid smallint,
    -> foreign key(pid) references province(id) on delete cascade
    -> );
Query OK, 0 rows affected (0.33 sec)

接着,向province中添加数据,如

mysql> insert province(name) values("A");
Query OK, 1 row affected (0.05 sec)

mysql> insert province(name) values("B");
Query OK, 1 row affected (0.06 sec)

mysql> insert province(name) values("C");
Query OK, 1 row affected (0.04 sec)

mysql> insert province(name) values("D");
Query OK, 1 row affected (0.03 sec)

mysql> select * from province;
+----+------+
| id | name |
+----+------+
|  1 | A    |
|  2 | B    |
|  3 | C    |
|  4 | D    |
+----+------+
4 rows in set (0.00 sec)

接着,向student中添加数据,如

mysql> insert student values(1234,"Tom",1);
Query OK, 1 row affected (0.06 sec)

mysql> insert student values(1235,"John",2);
Query OK, 1 row affected (0.03 sec)

mysql> insert student values(1236,"Mary",3);
Query OK, 1 row affected (0.04 sec)

mysql> select * from student;
+------+------+------+
| id   | name | pid  |
+------+------+------+
| 1234 | Tom  |    1 |
| 1235 | John |    2 |
| 1236 | Mary |    3 |
+------+------+------+
3 rows in set (0.00 sec)

现在,要把province中id为3的一行删除掉,如

mysql> delete from province where id=3;
Query OK, 1 row affected (0.04 sec)

mysql> select * from province;
+----+------+
| id | name |
+----+------+
|  1 | A    |
|  2 | B    |
|  4 | D    |
+----+------+
3 rows in set (0.00 sec)

现在来查看删除过后,子表student中的数据是否受到了影响,如

mysql> select * from student;
+------+------+------+
| id   | name | pid  |
+------+------+------+
| 1234 | Tom  |    1 |
| 1235 | John |    2 |
+------+------+------+
2 rows in set (0.01 sec)

我们,发现pid=3的一行已经不存在了,即它也自动删除了,这就是我们on delete cascade的作用。

(注意,外键约束需要默认引擎为innodb引擎,linux环境下可以通过修改配置文件/usr/share/mysql/my-default.cnf来修改默认引擎)

时间: 2024-11-05 23:31:25

详解MySQL的外键约束的相关文章

MySQL的外键约束:Cascade/Restrict/No action/SET NULL

转自:http://blog.csdn.net/cnjsnt_s/article/details/5548280 具体使用时需要参考:http://blog.csdn.net/codeforme/article/details/5539454 (注:没看很明白,囧.) MySQL有两种常用的引擎类型:MyISAM和InnoDB.目前只有InnoDB引擎类型支持外键约束.InnoDB中外键约束定义的语法如下: [CONSTRAINT [symbol]] FOREIGN KEY [index_nam

MySQL 建立外键约束

http://www.jzxue.com/shujuku/mysql/201109/06-8742.html MySQL 建立外键约束的语法太晦涩难懂了, 不得不记下笔记. 1. 在建表时建立外键 CREATE TABLE table_s ( `id` int(11) NOT NULL AUTO_INCREMENT, `column_name_from` int(11) NOT NULL, `name` varchar(256) NOT NULL, PRIMARY KEY (`id`), IND

mysql的外键约束

创建表格: #首先登录mysql mysql -uroot 打开一个数据库 mysql>use db1; 创建一个父表,我们命名为province, mysql> create table province ( -> id smallint auto_increment key, -> name varchar(10) NOT NULL -> ); 创建一个子表,命名为student,其中其pid引用来自province的id, mysql> create table

补12.关于mysql的外键约束

一.什么是mysql中的外键(froeign key) 假如说有两张表,其中一张表的某个字段指向了另一张表的主键,这就可以称之为外键(froeign key). 在子表中增加一条记录时,需要确定是否有与父表相对应的记录. 如果父表没有对应的记录,那么子表(从表)无法插入这条数据. 下面是一个关于外键的示例: 1.首先创建一个主表,这个主表存放了班级信息. create table class ( id TINYINT PRIMARY KEY auto_increment, class_name

mysql设置外键约束开启-关闭

在MySQL中删除一张表或一条数据的时候,出现 [Err] 1451 -Cannot delete or update a parent row: a foreign key constraint fails (...) 这是因为MySQL中设置了foreign key关联,造成无法更新或删除数据.可以通过设置FOREIGN_KEY_CHECKS变量来避免这种情况.   我们可以使用     SET FOREIGN_KEY_CHECKS=0;来禁用外键约束. 之后再用    SET FOREIG

Mysql添加外键约束

简单说一下使用外键的好处 1.完整性约束 比如:用户表中有字段 用户编号(id) , 名称(username)设备表中有字段 设备编号(id) , 设备名称(devicename) 设备属于的用户编号(user_id) 把设备表中的用户编号设置成外键,引用用户表的主键. 当向设备表中输入数据时,如果输入用户编号在用户表中找不到对应的话,就会报错,从而能保证这个设备必定会属于一个存在的用户. 2.可以实现级联删除 还引用上面的例子,当一个用户不在使用该系统时,需要将用户和他的设备从数据库删除,如果

使用Navicat for MySQL添加外键约束

转载:http://blog.csdn.net/u013215018/article/details/54981216 现在有两个表一张是Roles表(角色表),一张是RoleUser表(用户角色) 现在我想把RoleUser表中的RoleID属性设置为外键,关联Roles表中的RoleID属性. 操作步骤: 第一步: 第二步: 一共有七列.简单介绍一下这几列的意思: "名":  可以不填,你一会保存成功系统会自动生成. "栏位":就是你要把哪个键设置为外键.这里选

MySQL导入数据库--开启/关闭外键约束

今天从服务器上面以SQL文件导出数据库时,发现导入失败,提示insert 语句执行错误, 插入数据时内容有外键关联,无法插入数据. 可以通过设置MySQL的外键约束的方法来进行设置. mysql启动和关闭外键约束的方法(FOREIGN_KEY_CHECKS) 禁用外键约束: SET FOREIGN_KEY_CHECKS=0; 启用外键约束: SET FOREIGN_KEY_CHECKS=1; 查看当前外键约束的值: SELECT @@FOREIGN_KEY_CHECKS; 用SQLyog导出数据

truncate table时存在外键约束的解决办法

以前在使用truncate命令时遇到表存在外键引用时无法执行命令的情况都是用delete来代替,今天又遇到这个问题,于是在网上搜了一把,可以通过如下方式解决: 1.基本思路:先关闭mysql的外键约束,再执行truncate命令,然后再还原mysql的外键约束 2.打开.关闭.查看mysql的外键约束命令 禁用外键约束SET FOREIGN_KEY_CHECKS=0; 启动外键约束SET FOREIGN_KEY_CHECKS=1; 查看当前FOREIGN_KEY_CHECKS的值可用如下命令SE