一、约束
1 约束是保证数据的完整性和一致性
2 ▶ 约束分为表级约束和列级约束
(1)是根据约束所针对的字段的数目多少决定的。
(2)表级约束是针对两个或两个以上的字段。
(3)列级约束是针对某一个字段。
3 ▶ 约束类型包括(按功能来划分):
(1)主键约束(PRIMARY KEY) 主键约束(十四)
(2)唯一约束(UNIQUE KEY) 唯一约束(十五)
(3)默认约束(DEFAULT) 默认约束(十六)
(4)非空约束(NOT NULL) 空值(NULL)和非空(NOT NULL)(十二)
(5)外键约束(FOREIGN KEY) (本博文)
二、外键约束
1 ▶ 保证数据一致性,完整性
2 ▶ 实现数据表中一对一或一对多关系
三、外键约束的要求
1 ▶ 父表和子表必须使用相同的的存储引擎,而且禁止使用临时表。
子表指的是有外键的表。
父表是子表参照的表。
2 ▶ 数据表的存储引擎只能为INNODB.
3 ▶ 外键列和参照列必须具有相似的数据类型。数字的长度或是否有符号位必须相同,而字符的长度则可以不同。
外键列是增加过for in关键词的那列。
参照列是外键列参照的列。
4 ▶ 外键列和参照列必须创建索引。如果外键列不存在索引的话,MYSQL将自动创建索引。
注意,是外建列而不是参照列。MySQL是不可能为参照列自动创建索引的。
1 父表和子表必须使用相同的的存储引擎,而且禁止使用临时表。
有外键的表,成为子表。例子中是users数据表
父表是子表参照的表。例子中是provinces数据表
2 如果数据表的默认存储引擎不是INNODB,该怎么改?
找到my.ini配置文件
修改好后,重启生效即可。
3 外键列和参照列必须具有相似的数据类型。数字的长度或是否有符号位必须相同,而字符的长度则可以不同。这句话什么意思?
create database dajiangtai;
接下来,我们在数据库dajiangtai里,创建两张数据表,使它们俩有相同的数据类型。
在数据库dajiangtai里,创建数据表provinces
create table provinces( id smallint unsigned primary key auto_increment, Pname varchar(30) not null );
alter database dajiangtai character set utf8;
alter table provinces character set utf8;
在数据库dajiangtai里,创建数据表users
create table users( id smallint unsigned primary key auto_increment, username varchar(10) not null, pid bigint, foregin key (pid) references provinces (id) );
即,外建表是users,即子表。
参照表是provinces,即父表。
为什么呢。其实,我们这是故意的。在父表provinces,创建id是无符号位,这子表时,不写话,默认是有符号位的。
也就说,除了要外键列和参照列必须具有相似的数据类型。数字的长度或是否有符号位必须相同!
create table users if not exists users character set utf8( id smallint unsigned primary key auto_increment, username varchar(10) not null, pid smallint unsigned, foregin key (pid) references provinces (id) );
4 外键列和参照列必须创建索引。如果外键列不存在索引的话,MYSQL将自动创建索引。
show indexes from provincesG;
mysql> show indexes from provincesG;
*************************** 1. row ***************************
Table: provinces
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:
1 row in set (0.00 sec)
ERROR:
No query specified
这就是,如果外键列不存在索引的话,MYSQL将自动创建索引。