GVKun编程网logo

MYSQL 外键 (Foreign Key) 的使用(mysql 外键(foreign key)的详解和实例)

21

如果您想了解MYSQL外键(ForeignKey)的使用的相关知识,那么本文是一篇不可错过的文章,我们将对mysql外键(foreignkey)的详解和实例进行全面详尽的解释,并且为您提供关于FORE

如果您想了解MYSQL 外键 (Foreign Key) 的使用的相关知识,那么本文是一篇不可错过的文章,我们将对mysql 外键(foreign key)的详解和实例进行全面详尽的解释,并且为您提供关于FOREIGN KEY 是什么意思以及我们如何在 MySQL 表中使用它?、MYSQL ALTER Can''t assign foreign key (errno: 150)、mysql foreign key (外键) 说明与实例、Mysql foreignkey 相关的有价值的信息。

本文目录一览:

MYSQL 外键 (Foreign Key) 的使用(mysql 外键(foreign key)的详解和实例)

MYSQL 外键 (Foreign Key) 的使用(mysql 外键(foreign key)的详解和实例)

在 MySQL 3.23.44 版本后,InnoDB 引擎类型的表支持了外键约束。
外键的使用条件:
1. 两个表必须是 InnoDB 表,MyISAM 表暂时不支持外键(据说以后的版本有可能支持,但至少目前不支持);
2. 外键列必须建立了索引,MySQL 4.1.2 以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显示建立; 
3. 外键关系的两个表的列必须是数据类型相似,也就是可以相互转换类型的列,比如 int 和 tinyint 可以,而 int 和 char 则不可以;

外键的好处:可以使得两张表关联,保证数据的一致性和实现一些级联操作;

外键的定义语法:
[CONSTRAINT symbol] FOREIGN KEY [id] (index_col_name, ...)
    REFERENCES tbl_name (index_col_name, ...)
    [ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]
    [ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]
该语法可以在 CREATE TABLE 和 ALTER TABLE 时使用,如果不指定 CONSTRAINT symbol,MYSQL 会自动生成一个名字。
ON DELETE、ON UPDATE 表示事件触发限制,可设参数:
RESTRICT(限制外表中的外键改动)
CASCADE(跟随外键改动)
SET NULL(设空值)
SET DEFAULT(设默认值)
NO ACTION(无动作,默认的)

搞个例子,简单演示一下使用,做 dage 和 xiaodi 两个表,大哥表是主键,小弟表是外键:
建表:

 1 CREATE TABLE `dage` (
 2   `id` int(11) NOT NULL auto_increment,
 3   `name` varchar(32) default '''',
 4   PRIMARY KEY  (`id`)
 5 ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
 6
 7 CREATE TABLE `xiaodi` (
 8   `id` int(11) NOT NULL auto_increment,
 9   `dage_id` int(11) default NULL,
10   `name` varchar(32) default '''',
11   PRIMARY KEY  (`id`),
12   KEY `dage_id` (`dage_id`),
13   CONSTRAINT `xiaodi_ibfk_1` FOREIGN KEY (`dage_id`) REFERENCES `dage` (`id`)
14 ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

插入个大哥:
1 mysql> insert into dage (name) values ('' 铜锣湾 '');
2 Query OK, 1 row affected (0.01 sec)
3 mysql> select * from dage;
4 +----+--------+
5 | id | name   |
6 +----+--------+
7 |  1 | 铜锣湾 |
8 +----+--------+
9 1 row in set (0.00 sec)

插入个小弟:
1 mysql> insert into xiaodi (dage_id,name) values (1,'' 铜锣湾_小弟 A'');
2 Query OK, 1 row affected (0.02 sec)
3
4 mysql> select * from xiaodi;
5 +----+---------+--------------+
6 | id | dage_id | name         |
7 +----+---------+--------------+
8 |  1 |       1 | 铜锣湾_小弟 A |
9 +----+---------+--------------+

把大哥删除:
1 mysql> delete from dage where id=1;
2 ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`bstar/xiaodi`, CONSTRAINT `xiaodi_ibfk_1` FOREIGN KEY (`dage_id`) REFERENCES `dage` (`id`))


提示:不行呀,有约束的,大哥下面还有小弟,可不能扔下我们不管呀!

插入一个新的小弟:

1 mysql> insert into xiaodi (dage_id,name) values (2,'' 旺角_小弟 A'');              
2 ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`bstar/xiaodi`, CONSTRAINT `xiaodi_ibfk_1` FOREIGN KEY (`dage_id`) REFERENCES `dage` (`id`))
3


提示:小子,想造反呀!你还没大哥呢!

把外键约束增加事件触发限制:

 1 mysql> show create table xiaodi;
 2
 3   CONSTRAINT `xiaodi_ibfk_1` FOREIGN KEY (`dage_id`) REFERENCES `dage` (`id`)
 4
 5 mysql> alter table xiaodi drop foreign key xiaodi_ibfk_1; 
 6 Query OK, 1 row affected (0.04 sec)
 7 Records: 1  Duplicates: 0  Warnings: 
 8 mysql> alter table xiaodi add foreign key(dage_id) references dage(id) on delete cascade on update cascade;
 9 Query OK, 1 row affected (0.04 sec)
10 Records: 1  Duplicates: 0  Warnings: 0

再次试着把大哥删了:
1 mysql> delete from dage where id=1;
2 Query OK, 1 row affected (0.01 sec)
3
4 mysql> select * from dage;
5 Empty set (0.01 sec)
6
7 mysql> select * from xiaodi;
8 Empty set (0.00 sec)



得,这回对应的小弟也没了,没办法,谁让你跟我 on delete cascade 了呢!

例子说明的应该蛮清楚了吧,其他功能对应手册自己实践吧!:-)

FOREIGN KEY 是什么意思以及我们如何在 MySQL 表中使用它?

FOREIGN KEY 是什么意思以及我们如何在 MySQL 表中使用它?

foreign key 是什么意思以及我们如何在 mysql 表中使用它?

实际上 FOREIGN KEY 是一列或几列的组合,可用于设置两个表中数据之间的链接。换句话说,我们可以说 FOREIGN KEY 约束与两个表相关。它还用于增强数据完整性,因为表的主键链接到其他表的外键。

语法

FOREIGN KEY [column_name] REFERENCES [table having Primary Key] ([column_name]);
登录后复制

这里REFERENCES是一个关键字; column_name 是要设置 FOREIGN KEY 的列的列表;具有主键的表是包含主键的表的名称; column_name 是已设置 PRIMARY KEY 的列的列表。

示例

假设我们有两个表“Customer”和“Orders”。两个表之间的关系可以通过字段“Cust_Id”指定的表“orders”中的外键建立。创建两个表的查询如下 -

mysql> Create Table Customer(Cust_ID int Primary Key, First_name Varchar(20), Last_name  Varchar(20), City Varchar(10));
Query OK, 0 rows affected (0.13 sec)

mysql> Create Table Orders(Order_Id Int Primary Key, Product_Name Varchar(25), Orderdate DATE, Cust_ID Int, FOREIGN KEY(Cust_ID) REFERENCES Customer(Cust_id));
Query OK, 0 rows affected (0.13 sec)

mysql> Describe Orders;
+--------------+-------------+------+-----+---------+-------+
| Field        | Type        | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+-------+
| Order_Id     | int(11)     | NO   | PRI | NULL    |       |
| Product_Name | varchar(25) | YES  |     | NULL    |       |
| Orderdate    | date        | YES  |     | NULL    |       |
| Cust_ID      | int(11)     | YES  | MUL | NULL    |       |
+--------------+-------------+------+-----+---------+-------+
4 rows in set (0.04 sec)
登录后复制

这里,表“Customer”称为父表或引用表,表“Orders”称为子表或引用表。子表中的行必须包含父表中存在的值。例如,表“orders”中的每一行都必须具有“customer”表中存在的“Cust_Id”。

以上就是FOREIGN KEY 是什么意思以及我们如何在 MySQL 表中使用它?的详细内容,更多请关注php中文网其它相关文章!

MYSQL ALTER Can''t assign foreign key (errno: 150)

MYSQL ALTER Can''t assign foreign key (errno: 150)

现在有两张已建成的表,表 1 city 结构:

CREATE TABLE `city` (
  `id` bigint(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `address` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

另有一张表 region,内有一列 city_id 对应 city 表的 id:

CREATE TABLE `region` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `region_name` varchar(255) NOT NULL,
  `city_id` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8;

这时需要在将 region 表的 city_id 加上外键约束,使用命令:

ALTER TABLE region

ADD CONSTRAINT fk_hui

FOREIGN KEY (city_id)

REFERENCES city(id);

但是报错误:MYSQL ALTER Can''t assign foreign key (errno: 150)

导致这一错误的原因我已知的有两个:

1.city_id 和 city 表里的 id 类型不一致,一个是 int,一个是 bigint,针对这种情况,只需要将 city_id 的类型改为 bigint:

alter table region change city_id city_id bigint(11) NOT NULL

再添加外键约束就行(这里如果两者都是 bigint,即使一个是 bigint (12),一个是 bigint (11),一样可以添加外键成功,不过尽量让两者完全一致);

2. 添加的外键的名字已经存在,如本例中 fk_hui,假如在另一张表 district 里有个 city_id 也关联了 city 表的 id,并且外键约束的名字也是 fk_hui,这时只需要修改一下外键的名字,比如改成 fk_huihui 即可。

 

mysql foreign key (外键) 说明与实例

mysql foreign key (外键) 说明与实例

mysql foreign key (外键) 说明与实例

一,什么是 foreign key,及其完整性

个人觉得,foreign key 就是表与表之间的某种约定的关系,由于这种关系的存在,我们能够让表与表之间的数据,更加的完整,关连性更强。关于完整性,关连性我举个例子,大家就会明白了。

有二张表,一张是用户表,一张是订单表:

1,如果我删除了用户表里的用户,那么订单表里面根这个用户有关的数据,就成了无头数据了,不完整了。

2,如果我在订单表里面,随便插入了一条数据,这个订单在用户表里面,没有与之对应的用户。这样数据也不完整了。

如果有外键的话,就方便多了,可以不让用户删除数据,或者删除用户的话,通过外键同样删除订单表里面的数据,这样也能让数据完整。

二,使用 foreign key,遵守以下几点规则

1,有外键约束的表,必须是 innodb 型

2,外键约束的二个表,本来就相关系的表,并且要有索引关系,如果没有,创建外键时也可以创建索引。

3,不支持对外键列的索引前缀。这样的后果之一是 BLOB 和 TEXT 列不被包括在一个外键中,这是因为对这些列的索引必须总是包含一个前缀长度。

4,mysql 外键的名子在数据库内要是唯一的

三,创建 foreign key 的语法规则

[CONSTRAINT symbol] FOREIGN KEY [id] (index_col_name, ...)
    REFERENCES tbl_name (index_col_name, ...)
    [ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION}]
    [ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION}]

四,外键维护数据完整性的 5 种方式

1,CASCADE: 从父表删除或更新且自动删除或更新子表中匹配的行。ON DELETE CASCADE 和 ON UPDATE CASCADE 都可用。在两个表之间,你不应定义若干在父表或子表中的同一列采取动作的 ON UPDATE CASCADE 子句。

2,SET NULL: 从父表删除或更新行,并设置子表中的外键列为 NULL。如果外键列没有指定 NOT NULL 限定词,这就是唯一合法的。ON DELETE SET NULL 和 ON UPDATE SET NULL 子句被支持。

3,NO ACTION: 在 ANSI SQL-92 标准中,NO ACTION 意味这不采取动作,就是如果有一个相关的外键值在被参考的表里,删除或更新主要键值的企图不被允许进行(Gruber, 掌握 SQL, 2000:181)。 InnoDB 拒绝对父表的删除或更新操作。

4,RESTRICT: 拒绝对父表的删除或更新操作。NO ACTION 和 RESTRICT 都一样,删除 ON DELETE 或 ON UPDATE 子句。(一些数据库系统有延期检查,并且 NO ACTION 是一个延期检查。在 MySQL 中,外键约束是被立即检查的,所以 NO ACTION 和 RESTRICT 是同样的)。

5,SET DEFAULT: 这个动作被解析程序识别,但 InnoDB 拒绝包含 ON DELETE SET DEFAULT 或 ON UPDATE SET DEFAULT 子句的表定义。

五,实例说明 foreign key 的用法

  1. mysql> CREATE TABLE `user` (                   // 创建用户表  
  2.  ->   `id` int(11) NOT NULL auto_increment COMMENT '' 用户 ID'',  
  3.  ->   `name` varchar(50) NOT NULL default '''' COMMENT '' 名称'',  
  4.  ->   `sex` int(1) NOT NULL default ''0'' COMMENT ''0 为男,1 为女'',  
  5.  ->   PRIMARY KEY  (`id`)  
  6.  -> ) ENGINE=innodb  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;   //innodb 引擎  
  7. Query OK, 0 rows affected, 1 warning (0.11 sec)  
  8.   
  9. mysql> insert into user (name,sex)values("tank",1),("zhang",2);   // 插入二条数据  
  10. Query OK, 2 rows affected (0.00 sec)  
  11. Records: 2  Duplicates: 0  Warnings: 0  
  12.   
  13. mysql> create table `order` (              // 创建订单表  
  14.  ->  `order_id` int(11) not null auto_increment comment '' 订单 ID'',  
  15.  ->  `u_id` int(11) not null default ''0'' comment '' 用户 ID'',  
  16.  ->  `username` varchar(50) not null default '''' comment '' 用户名'',  
  17.  ->  `money` int(11) not null default ''0'' comment '' 钱数'',  
  18.  ->  `datetime` timestamp not null default current_timestamp comment '' 生成时 
  19. 间'',  
  20.  ->  primary key(`order_id`),  
  21.  ->  index (`u_id`),  
  22.  ->  FOREIGN KEY order_f_key (u_id) REFERENCES user(id)     // 创建外键  
  23.  -> )ENGINE=innodb  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;    //innodb 引擎  
  24. Query OK, 0 rows affected, 1 warning (0.06 sec)  
  25.   
  26. mysql> INSERT INTO `order` (`u_id`, `username`, `money`, `datetime`) VALUES (''1''''tank'',''2222'',  
  27.  CURRENT_TIMESTAMP);      // 插入一条订单  
  28. Query OK, 1 row affected (0.00 sec)  
  29.   
  30. mysql> delete from user where id =1;    // 删除用户 1,不给删除,因为 order 表里面有和这条数据有关连的数据  
  31. ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`test/order`, CONSTRAINT `order_ibfk_1` FOREIGN KEY (`u_id`) REFERENCES `user` (`id`))  
  32.   
  33. // 下面在 order 里面插入一条数据 u_id 为 5 用户,在 user 表里面根本没有,所以插入不进去。  
  34. mysql> INSERT INTO `order` (`u_id`, `username`, `money`, `datetime`) VALUES (''5''''good'',''123'',  CURRENT_TIMESTAMP);  
  35. ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`test/order`, CONSTRAINT `order_ibfk_1` FOREIGN KEY (`u_id`) REFERENCES `user` (`id`))  
  36.   
  37. // 把 u_id 改成 2 就可以插进去了,因为 user 表里面有 id=2 的用户  
  38. mysql> INSERT INTO `order` (`u_id`, `username`, `money`, `datetime`) VALUES (''2''''zhang'',''3452'',  CURRENT_TIMESTAMP);  
  39. Query OK, 1 row affected (0.00 sec)  
  40.   
  41. mysql> show create table `order`\G;     // 查看创建表的数据,为的是查看 foreign key 的名子,还有 order 二边要有 ` 这个符号  
  42. *************************** 1. row ***************************  
  43.  Table: order  
  44. Create Table: CREATE TABLE `order` (  
  45.  `order_id` int(11) NOT NULL auto_increment COMMENT '' 订单 ID'',  
  46.  `u_id` int(11) NOT NULL default ''0'' COMMENT '' 用户 ID'',  
  47.  `username` varchar(50) NOT NULL default '''' COMMENT '' 用户名'',  
  48.  `money` int(11) NOT NULL default ''0'' COMMENT '' 钱数'',  
  49.  `datetime` timestamp NOT NULL default CURRENT_TIMESTAMP COMMENT '' 生成时间'',  
  50.  PRIMARY KEY  (`order_id`),  
  51.  KEY `u_id` (`u_id`),  
  52.  CONSTRAINT `order_ibfk_1` FOREIGN KEY (`u_id`) REFERENCES `user` (`id`)  
  53. ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8  
  54. 1 row in set (0.00 sec)  
  55.   
  56. ERROR:  
  57. No query specified  
  58.   
  59. mysql> alter table `order` drop foreign key order_ibfk_1;   // 删除 foreign key,mysql 里面没有修改 foreign key 的命令  
  60. Query OK, 2 rows affected (0.10 sec)  
  61. Records: 2  Duplicates: 0  Warnings: 0  
  62.   
  63. // 删除后在新增  
  64. mysql> alter table `order` add foreign key(u_id) references user(id) on delete cascade on update cascade;  
  65. Query OK, 2 rows affected (0.00 sec)  
  66. Records: 2  Duplicates: 0  Warnings: 0  
  67.   
  68. mysql> update user set id=6 where id=1;     // 更新 user 表里面的 id  
  69. Query OK, 1 row affected (0.05 sec)  
  70. Rows matched: 1  Changed: 1  Warnings: 0  
  71.   
  72. mysql> select * from `order` where u_id=6;   //order 表里面的数据,也根着改变了。  
  73. +----------+------+----------+-------+---------------------+  
  74. | order_id | u_id | username | money | datetime            |  
  75. +----------+------+----------+-------+---------------------+  
  76. |        2 |    6 | tank     |  2222 | 2010-11-25 22:18:57 |  
  77. +----------+------+----------+-------+---------------------+  
  78. 1 row in set (0.00 sec)  

foreign key 只能用于 innodb,并且对数据进行操作时,会对外键关联的表进行检索,会影响效率的。所以对外键的使用,要根据个人的实际情况。

作者:海底苍鹰
地址:http://blog.51yip.com/mysql/1136.html

Mysql foreignkey 相关

Mysql foreignkey 相关

foreignkey  是指一对多关系时建立的关系:

 外键是表中与另一个表的另一个字段匹配的字段。外键对相关表中的数据施加限制,这使MySQL能够保持参照完整性。  

操作:

  

能看懂图吗?

 

下面直接看代码:

  

我们有两个表:customersorders. 每个客户都有零个或多个订单,每个订单只能属于一个客户。customers表和orders之间的关系是一对多关系,并且orders由该customerNumber字段指定表中的外键建立表中customerNumber字段与orders表中的customerNumber主键字段相关  customers

customers 表称为父表或被引用表,该orders表称为子表引用表

外键可以是一列或一组列。子表中的列通常引用父表中主键列。

一个表可能有多个外键,并且子表中的每个外键都可能引用不同的父表。

子表中的行必须包含父表中存在的值,例如,表中的每个订单记录orders必须具有表customerNumber中存在的值customers因此,多个订单可以指同一个客户,这种关系被称为一个(客户)多个(订单)或一对多。

有时,子表和父表是相同的。外键返回到表的主键,例如下employees表:

MySQL递归外键

reportTo列是一个外键,它指的employeeNumberemployees表格的主键,以反映员工之间的报告结构,即每个员工向另一个员工报告,员工可以有零个或多个直接报告。我们有一个关于自联接的特定教程,可以帮助您根据这种表格查询数据。

reportTo外键也被称为递归自引用的外键。

外键实施参照完整性,可帮助您自动维护数据的一致性和完整性。例如,您无法为不存在的客户创建订单。

另外,您可以为customerNumber外键设置级联删除操作,这样当您删除customers表中的客户时,与客户关联的所有订单也会被删除。这为您节省了使用多个DELETE语句 DELETE JOIN语句的时间和精力

与删除相同,还可以定义级联更新操作,以便customerNumber外键执行跨表更新,而不使用多个UPDATE语句或UPDATE JOIN语句

在MySQL中,InnoDB 存储引擎支持外键,因此您必须创建InnoDB表才能使用外键约束。

 

 

 

添加外键代码:

  

CONSTRAINT constraint_name
FOREIGN KEY foreign_key_name (columns)
REFERENCES parent_table(columns)
ON DELETE action
ON UPDATE action
View Code
  • CONSTRAINT子句允许您为外键约束定义约束名称。如果你忽略它,MySQL会自动生成一个名字。
  • FOREIGN KEY子句指定子表中引用父表中主键列的列。你可以在FOREIGN KEY子句之后放置一个外键名,或者让它为MySQL创建一个名字。注意MySQL会自动创建一个带有foreign_key_name名字的索引
  • REFERENCES子句指定父表和它的子表中的列引用的列。在规定的子表和父表的列数FOREIGN KEYREFERENCES必须相同。
  • ON DELETE子句允许您定义删除父表中的记录时,子表中记录发生的情况。如果您省略了ON DELETE子句并删除了在子表中具有记录的父表中的记录,那么MySQL将拒绝删除。此外,MySQL还为您提供了一些操作,以便您可以使用其他选项,例如ON DELETE CASCADE  ,要求MySQL删除子表中引用父表中的记录时父表中的记录被删除的记录。如果您不希望删除子表中的相关记录,则可以使用该ON DELETE SET NULL操作。MySQL会将子表中的外键列值设置为NULL当父表中的记录被删除时,使用子表中的外键列必须接受NULL值的条件。请注意,如果您使用ON DELETE NO ACTIONON DELETE RESTRICT操作,MySQL将拒绝删除。
  • ON UPDATE子句允许您指定更新父表中的行时发生的子表中的行。ON UPDATE当父表中的行更新时,可以省略该子句以使MySQL拒绝对子表中的行进行任何更新。ON UPDATE CASCADE操作允许您执行交叉表更新,当父表ON UPDATE SET NULL中的行更新时,该操作会将子表中的行中的值重置为值NULLON UPDATE NO ACTIONUPDATE RESTRICT行动拒绝任何更新。

 

 

 

MySQL创建表外键示例

下面的示例创建一个dbdemo数据库和两个表:categories和  products.每个类别具有一个或多个产品和每个产品只属于一个类别。表中cat_id字段products被定义为带有UPDATE ON CASCADEDELETE ON RESTRICT动作的外键

 

CREATE DATABASE IF NOT EXISTS dbdemo;
 
USE dbdemo;
 
CREATE TABLE categories(
   cat_id int not null auto_increment primary key,
   cat_name varchar(255) not null,
   cat_description text
) ENGINE=InnoDB;
 
CREATE TABLE products(
   prd_id int not null auto_increment primary key,
   prd_name varchar(355) not null,
   prd_price decimal,
   cat_id int not null,
   FOREIGN KEY fk_cat(cat_id)
   REFERENCES categories(cat_id)
   ON UPDATE CASCADE
   ON DELETE RESTRICT
)ENGINE=InnoDB;
View Code

将外键添加到表中

MySQL添加外键语法

要将外键添加到现有表中,可以使用ALTER TABLE语句和上面的外键定义语法:

ALTER table_name
ADD CONSTRAINT constraint_name
FOREIGN KEY foreign_key_name(columns)
REFERENCES parent_table(columns)
ON DELETE action
ON UPDATE action;
View Code

MySQL添加外键示例

现在,我们添加一个名为的新表,vendors并更改products表以包含供应商ID字段:

USE dbdemo;
 
CREATE TABLE vendors(
    vdr_id int not null auto_increment primary key,
    vdr_name varchar(255)
)ENGINE=InnoDB;
 
ALTER TABLE products 
ADD COLUMN vdr_id int not null AFTER cat_id;
View Code

要将外键添加到products表中,请使用以下语句:

2
3
4
5
ALTER TABLE products
ADD FOREIGN KEY fk_vendor(vdr_id)
REFERENCES vendors(vdr_id)
ON DELETE NO ACTION
ON UPDATE CASCADE;
View Code

现在,该products表有两个外键,一个categories表指向表,另一个指向vendors表。

删除MySQL外键

您还可以使用该ALTER TABLE语句删除外键,如下所示:

ALTER TABLE table_name 
DROP FOREIGN KEY constraint_name;
View Code

在上面的声明中:

  • 首先,指定要从中删除外键的表名。
  • 其次,您将约束名称放在该DROP FOREIGN KEY子句之后。

注意,这constraint_name是在创建或向表中添加外键时指定的约束的名称。如果你忽略它,MySQL会为你生成一个约束名称。

要获取表的生成约束名称,请SHOW CREATE TABLE按如下所示使用该语句:

 

SHOW CREATE TABLE table_name;

例如,要查看products的外键,可以使用以下语句:

    
SHOWS  CREATE TABLE products;

 

 

 

On Delete和On Update都有Restrict,No Action, Cascade,Set Null属性。现在分别对他们的属性含义做个解释。

  • ON DELETE

restrict(约束):当在父表(即外键的来源表)中删除对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除。

no action:意思同restrict.即如果存在从数据,不允许删除主数据。

cascade(级联):当在父表(即外键的来源表)中删除对应记录时,首先检查该记录是否有对应外键,如果有则也删除外键在子表(即包含外键的表)中的记录。

set null:当在父表(即外键的来源表)中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为null(不过这就要求该外键允许取null)

  • ON UPDATE

restrict(约束):当在父表(即外键的来源表)中更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许更新。

no action:意思同restrict.

cascade(级联):当在父表(即外键的来源表)中更新对应记录时,首先检查该记录是否有对应外键,如果有则也更新外键在子表(即包含外键的表)中的记录。

set null:当在父表(即外键的来源表)中更新对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为null(不过这就要求该外键允许取null)。

注:NO ACTION和RESTRICT的区别:只有在及个别的情况下会导致区别,前者是在其他约束的动作之后执行,后者具有最高的优先权执行。

今天的关于MYSQL 外键 (Foreign Key) 的使用mysql 外键(foreign key)的详解和实例的分享已经结束,谢谢您的关注,如果想了解更多关于FOREIGN KEY 是什么意思以及我们如何在 MySQL 表中使用它?、MYSQL ALTER Can''t assign foreign key (errno: 150)、mysql foreign key (外键) 说明与实例、Mysql foreignkey 相关的相关知识,请在本站进行查询。

本文标签: