Mysql完整性约束

一、完整性约束的定义

完整性约束(或简称“约束”)是数据库的内容必须随时遵守的规则,它们描述了对数据库的哪一次更新是被允许的。一旦定义了完整性约束,Mysql就会负责在每次更新后,测试新的数据内容是否符合相关的约束。

二、完整性约束的分类

2.1主键约束

主键就是表中的一列或多个列的一组,它们能够唯一地标识表中的每一行。

通过定义PRIMARY KEY约束来创建主键,而且PRIMARY KEY约束中的列不能取空值。

可以用两种方式定义主键,作为列或者表的完整性约束。作为列的完整性约束时,只需要在列定义的时候加上关键字PRIMARY KEY 。作为表的完整性约束时,需要在定义的最后列后加上一条PRIMARY KEY(列名,...)语句。

原则上,任何列或者列的组合都可以充当一个主键。但是主键列必须遵守一些规则:

1、每个表只能定义一个主键。

2、关系模型理论要求必须为每一个表定义一个主键。mysql中并没有这样的要求,可以创建一个没有主键的表。为了安全起见,建议为每个基础表指定一个主键。

3、表中的两个不同的行在主键上不能具有相同的值。即“唯一性原则”。

4、如果从一个复合主键中删除一列后,剩下的列构成的主键仍然满足唯一性原则,那么,这个复合主键是不正确,即“最小化规则”。

5、一个列名在一个主键的列的列表中只能出现一次。

2.2替代键约束

在关系模型中,替代键像主键一样是表的一列或者一组列,它们的值在任何时候都是唯一的。

替代键是没有被选作主键的候选键。

定义替代键的关键字是UNIQUE。

替代键与主键的主要区别:

1、一个表只能有一个主键,但可以有多个候选键,甚至可以重合。

2、主键字段的值不能为空,候选键可以。

3、都可以自动产生索引。

2.3参照完整性约束

参照完整性约束是一种特殊的完整性约束,表现为一个外键。

当指定一个外键的时候,应遵循以下规则:

1、必须为被参照表定义主键

2、必须在被参照表的表名后面指定列名。这个列必须是这个表的之间或替代键。

3、外键中列的数目必须和被参照表的主键中列数目相同。

4、外键列的数据类型必须和被参照表主键中列的数据类型相同。

2.4CHECK完整性约束

当我们需要限定一些数据的范围时,可以使用check完整性约束。

CHECK完整性约束在创建表的时候定义。可以定义为列完整性约束,也可以定义为表完整性约。

2.5命名完整性约束

如果一条INSERT、UPDATE或DELETE语句违反了完整性约束,则MySql返回一条出错的消息并且拒绝更新,一个更新可能会导致多个完整性约束的违反。在这种情况下,应用程序获取几套出错消息。为了确切地表示出是违反了哪一个完整性约束,可以为每个完整性约束分配一个名字,随后,出错消息包含这个名字,从而使得消息对于应用程序更有意义。

三、案列

3.1.1主键定义:创建表xs1,将姓名定义为主键:

create table wfx.xs1
(
学号 varchar(6) null,
姓名 varchar(8) not null primary key,
出生日期 datetime
);

3.1.2复合主键的定义: 创建course表,学号、课程号、毕业日期定义为主键:

create table course
(
学号 varchar(6) not null,
姓名 varchar(8) not null,
毕业日期 date   not null,
课程号varchar(3),
学分tinyint,
primary key(学号,课程号,毕业日期)
)

 3.1.3通常MySQL自动地为主键创建一个索引primary。我们可以重新给这个索引起名:

primary key index_primary(学号,课程号,毕业日期)

3.2.1定义一个替代键:

create table xs1
(
学号 varchar(6) null,
姓名 varchar(8) not null unique,
出生日期 datetime
);

3.2.2定义为表的完整性约束:

create table xs1
(
学号 varchar(6) null,
姓名 varchar(8) not null,
出生日期 datetime
unique(姓名)
);

 

3.3.1创建表xs2,xs1表中所有学生学号都必须出现在xs2表中:

create table xs2(
学号 varchar(6) null,
姓名 varchar(8) nut null,
出生日期 datetime null,
primary key(姓名)
foreign key(学号)
    references xs1(学号)
        on delete restrict
        on update restrict
);

3.3.2与外键相关的被参照表和参照表可以是同一个表,这样的表成为自参照表:

create table wfx.xs2(
	学号 varchar(6) not null,
    姓名 varchar(8) not null,
    出生日期 datetime null,
    primary key(学号),
	foreign key(学号)
		references xs2(学号)
)

 

3.4.1创建表student,性别只能是男或女:

create table wfx.student(
	学号 varchar(6) primary key,
	gender char(6) not null
		check(gender in('男','女'))
);

3.5.1创建表xs3,将姓名定义为主键:

create table xs3
(
学号 varchar(6) null,
姓名 varchar(8) not null ,
出生日期 datetime
constraint primary_key_xs3 primary key(姓名)
);

感觉有收获,就点个关注吧(感谢、感谢!)!持续更新......

  • 7
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不许代码码上红

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值