SQL外键:Foreign Key
            
                发布时间:2024-04-05 19:30:01
            
            SQL 外键(Foreign Key)用于将两个表连接在一起,让两个表的数据保持同步。
外键由表中的一个字段或者多个字段构成,一个表的外键用来指向另一个表的主键(Primary Key)。包含外键的表称为从表,被指向的表称为主表。从表的数据受到主表的约束,向从表中插入或者更新数据时,外键的值必须存在于主表的主键中。
下面的例子能够很好地说明什么是外键。现在有两个表,分别是 user 和 order:
	
		user 表
	
		
			| 
				id
 | 
			
				username | 
			
				password | 
			
				email | 
			
				cellphone | 
			
				ip | 
		
		
			| 
				1 | 
			
				mozhiyan | 
			
				123456 | 
			
				java@www.365tools.cn | 
			
				13112344444 | 
			
				121.17.25.194 | 
		
		
			| 
				2 | 
			
				fanhua | 
			
				xyzabc | 
			
				c@www.365tools.cn | 
			
				15028882233 | 
			
				117.25.156.179 | 
		
		
			| 
				3 | 
			
				greatman | 
			
				123abc | 
			
				python@www.365tools.cn | 
			
				13290029028 | 
			
				125.64.104.35 | 
		
	
	
		order 表
	
		
			| 
				oid
 | 
			
				uid
 | 
			
				order_no | 
			
				price | 
			
				creat_time | 
			
				pay_time | 
		
		
			| 
				1 | 
			
				3 | 
			
				77895 | 
			
				99.5 | 
			
				2019-06-23 12:34:01 | 
			
				2019-06-23 12:35:28 | 
		
		
			| 
				2 | 
			
				3 | 
			
				44678 | 
			
				80.0 | 
			
				2019-12-04 23:00:44 | 
			
				2019-12-05 06:35:18 | 
		
		
			| 
				3 | 
			
				1 | 
			
				22456 | 
			
				13.5 | 
			
				2020-09-01 08:05:52 | 
			
				2020-09-01 08:15:41 | 
		
		
			| 
				4 | 
			
				1 | 
			
				24562 | 
			
				2020.0 | 
			
				2020-09-25 14:15:00 | 
			
				2020-09-25 14:18:06 | 
		
	
蓝色粗体字段表示主键,
红色粗体字段表示外键。在本例中,order 是从表,uid 字段是它的外键;user 是主表,id 字段是它的主键。order 表的外键 uid 指向 user 表的主键 id,uid 的取值受到 id 的制约,uid 的值必须存在于 id 中,否则无法被接受。
对外键约束的几点说明:
	- 
		一个表可以有多个外键,但是只能有一个主键。
 
	- 
		外键约束用于防止破坏两个表之间的关联性,保证数据的完整性和一致性。
 
	- 
		外键约束能够防止非法数据进入外键字段,因为它的值必须存在于它指向的主键中。
 
	- 
		从表的外键类型,必须与主表的主键类型一致。
 
	- 
		删除/更新主表记录时,可以选择同时删除/更新从表中的相关记录,也可以选择不删除/更新,您可以在定义外键时对此进行设置。
 
	- 
		删除主表记录时,必须先删除从表中的关联记录,否则主表中的记录将无法删除。
 
	- 
		删除主表时,必须先删除从表,否则主表将无法删除。
 
	示例
我们使用 SQL 语句实现上面的 user 和 order 表的结构。
创建 user 表:
CREATE TABLE user(
   id        INT           NOT NULL  AUTO_INCREMENT,
   username  VARCHAR (30)  NOT NULL,
   password  VARCHAR (20)  NOT NULL,
   email     VARCHAR (30)  NOT NULL,
   cellphone CHAR (11),
   ip        CHAR (15)     NOT NULL,
   PRIMARY KEY (id)
);
创建 order 表:
CREATE TABLE `order`(
   oid       INT           NOT NULL  AUTO_INCREMENT,
   uid       INT  references user(id),
   order_no  CHAR (11)  NOT NULL,
   price  DECIMAL (6, 1) DEFAULT 0.0,  
   creat_time     datetime  NOT NULL,
   pay_time     datetime  NOT NULL,
   PRIMARY KEY (oid)
);
注意,
order是 SQL 中的关键字,用作表名时需要使用反引号(位于 Tab 键上方)包围。
如果您已经创建了 order 表并且没有设置外键,那么可以使用 ALTER TABLE 命令来添加外键,如下所示:
ALTER TABLE `order`
ADD FOREIGN KEY (uid) REFERENCES user (id);
	删除外键
要删除外键约束,请使用下面的 SQL 语句:
ALTER TABLE `order`
DROP FOREIGN KEY;
	主键 VS 外键
以下是 SQL 主键和外键的一些重要区别:
	- 
		主键不能包含 NULL 值,外键可以包含 NULL 值。
 
	- 
		每条记录的主键都必须是唯一的,不能重复,而不同记录的外键可以是相同的。
 
	- 
		表中只能有一个主键,但是可以有多个外键。
 
	- 
		默认情况下,数据库引擎会自送为主键创建索引;而外键不会,您必须手动为外键创建索引。