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

 

 

 

 

 

 

 

 

一、约束

  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 provinces\G;

mysql> show indexes from provinces\G;
*************************** 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将自动创建索引。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值