外键约束要求解析(十七)

一、约束

  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将自动创建索引。

原文地址:https://www.cnblogs.com/zlslch/p/6534770.html