表的数据完整性(MySQL怎么为表添加约束)——MySQL 5.7数据库


1.非空约束

       在前面的数据表定义过程中,每个字段都要有一个是否为null值的选择,这就是对数据表中将来的数据提出的约束条件。

(1)null(允许空值):

       表示数值未确定,并不是数字“0”或字符“空格”。表中的比较两个空值或空值与其他任何类型值比较的结果为空值。

(2)not null(不允许空值):

       表示数据列中不允许空值出现。这样可以确保数据列中必须包含有意义的值。对于数据列中设置“不允许空值”,在向表中输入数据时,就必须输入一个值,否则该行数据将不会被收入表中。

例如:

学生选课时,学号、课程号就不能为空值,因为这必须是确定值,才能描述哪位同学选的什么课。如果存在成绩字段,则成绩字段就应该允许空值,因为此时还没有结束课程,成绩是不确定的。

       设置表的非空约束是指在创建表时为表的某些特殊字段加上not null约束条件。非空约束将保证所有记录中该字段都有值。如果用户新插入的记录中,该字段为空值,则数据库系统会自动报错。


何云辉 CSDN

2.主键约束

       设置主键的主要是可以帮助MySQL以最快的速度查找到表中的指定信息。primary key可指定一个字段作为表主键,也可以指定2个及以上的字段作为复合主键,其值能唯一地标识表中的每一行记录,而且primary key约束中的列不允许取空值。
       由于primary key约束能确保数据唯一,所以经常用来定义标志列。
       可以在创建表时创建主键,也可以对表中已有主键进行修改或者增加新的主键。设置主键通常有两种方式:表的完整性约束和列的完整性约束。

(1)创建表时定义完整性约束

若在列定义的时加上关键字primary key,就可以定义列的完整性约束主键。
如:创建表course01,用列的完整性约束设置主键。

mysql>create table if not exists course01 
	  (courseno  char(6) not null primary key, 
	  cname  char(6) not null, 
	  type char(8) not null,  
	  period int(2) not null, 
	  exp int(2) not null,
	  term int(2) not null); 

在这里插入图片描述
说明:
(1)主键可以是单一字段时,可以是表级约束,也可以是列级约束。
(2)当表中的主键为复合主键时,只能定义为表的完整性约束。例如,前面定义score表时,就是采用这种方式。

(2)修改表的主键

如:修改表student02的主键,删除原来主键sname,增加studentno 为主键。

mysql> alter table student02 add primary key (sname);
mysql> alter table student02 drop primary key;
mysql> alter table student02 add primary key (studentno);

在这里插入图片描述


何云辉 CSDN

3.外键约束

(1)参照完整性

       在关系型数据库中,有很多规则是和表之间的关系有关的,表与表之间往往存在一种“父子”关系。例如,字段studentno是一个表score表的属性,且依赖于表student的主键studentno。那么,称表student为父表,表score为子表。通常将studentno设为表score的外键,参照表student的主键字段,通过studentno字段将父表student和子表score建立关联关系。
       外键的作用是建立子表与其父表的关联关系,保证子表与父表关联的数据一致性。父表中更新或删除某条信息时,子表中与之对应的信息也必须有相应的改变。

(2)设置外键的原则:

必须依赖于数据库中已存在的父表的主键;外键可以为空值。

这样,当需要在score表中添加、删除、修改studentno字段的数据时,其结果中的studentno值必须在student表存在。即编辑成绩表score中的学号studentno时,该学号必须是student表存在的学号。这种类型的关系就是参照完整性约束(referential integrity constraint)。

外键声明和参照完整性定义的语法格式如下:

constraint foreign_key_name  foreign key (col_name1 [,col_name2….])
references table_name(col_name1[,col_name2...)]) 
[on delete {restrict | cascade | set null | no action}] 
[on update  {restrict | cascade | set null | no action}] 

(1)constraint foreign_key_name:定义外键约束和约束名。foreign key (col_name1 [,col_name2….],外键引用的字段表。
(2)外键被定义为表的完整性约束,reference_definition中包含了外键所参照的表和列,还可以声明参照动作。
(3)restrict:当要删除或更新父表中被参照列上在外键中出现的值时,拒绝对父表的删除或更新操作。
(4)cascade:从父表删除或更新行时自动删除或更新子表中匹配的行

(5)set null:当从父表删除或更新行时,设置子表中与之对应的外键列为null。如果外键列没有指定not null限定词,这就是合法的。
(6)no action:no action意味着不采取动作,就是如果有一个相关的外键值在被参考的表里,删除或更新父表中主要键值的企图不被允许,和restrict一样。
(7)set default:作用和set null一样,只不过set default是指定子表中的外键列为默认值。

(3)对已有的表添加外键

alter table语句在数据库teaching中,为表score添加外键约束。

mysql>alter table score
    -> add constraint fk_st_score 
    -> foreign key(studentno) references student(studentno);
mysql>alter table score
    ->add constraint fk_cou_score 
    ->foreign key(courseno) references course(courseno);

在这里插入图片描述

(4)在创建表时创建外键

       在mysqltest数据库,参照score表创建score1表,其中studentno作为外键,参照student02表中的studentno字段。

mysql> create table if not exists score1
    -> (studentno  char(11) not null, courseno char(6) not null,
	-> daily float(3,1) default 0, final float(3,1) default 0,
	-> primary key (studentno , courseno),
	-> foreign key(studentno)
	-> references student02(studentno)
	-> on update cascade
	-> on delete cascade);

在这里插入图片描述


何云辉 CSDN

4.检查约束

       利用主键和外键约束可以实现一些常见的完整性操作。在进行数据完整性管理时,还需要一些针对数据表的列进行限制数值范围的约束。例如,score表中final字段的数值要在0~100之间,表中birthdate必须大于1990年12月31日。这样的规则可以使用check完整性约束来指定。
       check约束在创建表时定义,可以定义为列完整性约束,也可以定义为表完整性约束。定义check约束时的格式比较简单。

       在mysqltest数据库中,对student02表的birthdate列添加check约束,要求出生日期必须大于1999年12月31日,性别只能是“男”和“女”。

mysql> alter table student02
  	-> add constraint ch_stu_birth
  	-> check(birthdate>'1999-12-31');

在这里插入图片描述


何云辉 CSDN

5.唯一性约束

       唯一性是指所有记录中该字段的值不能重复出现。设置表的唯一性约束是指在创建表时为表的某些特殊字段加上unique约束条件。唯一性约束将保证所有记录中该字段的值不能重复出现。创建表时可以设置列的唯一约束,也可以在已经创建的表的列上添加唯一。例如,在Email字段加上唯一性约束,所以记录中Email字段上不能出现相同的值。

如:在mysqltest数据库中,对student02表的Email列添加唯一约束。

mysql> alter table student02 add unique (Email);
mysql> select  studentno,sname,email  from student02;
mysql> insert into student02
       values ('16104444444' , '徐赛克', '男'  , 
       '2001-01-01',  '809', '13102020207', 'z3@162.com');
ERROR 1062 (23000): Duplicate entry 'z3@162.com' for key 'Email'
                                            //插入失败,违反唯一性约束的条件

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
说明:
(1)一个数据表只能创建一个主键,但可以有若干个unique约束。
(2)主键列值不允许为null,而unique字段的值可取null,但是必须使用nullnot null声明。
(3)一般在创建primary key约束时,系统会自动产生primary key索引。创建unique约束时,系统自动产生unique索引。


何云辉 CSDN
### 解决方案概述 在MySQL 5.7中遇到`ON DUPLICATE KEY UPDATE`语句报错的情况,通常涉及死锁、约束违反或其他数据库异常。为了有效处理这些问题并找到合适的解决方案,可以从以下几个方面入手: #### 死锁预防与解决措施 当多个线程尝试在同一时间向具有相同唯一键的数据间隙插入新记录时可能发生死锁现象[^1]。为了避免这种情况的发生,可以考虑调整应用程序逻辑以减少并发度或优化结构设计来降低锁定竞争的可能性。 对于已经发生的死锁错误(如Error Code: 1213),建议采取重试机制,在捕获到此类特定类型的错误之后自动重新提交受影响的操作直到成功为止。此外还可以通过设置较低级别的隔离级别(READ COMMITTED)从而减小产生gap locks的概率进而缓解潜在的死锁风险[^5]。 #### 处理重复键冲突 如果是因为存在重复的关键字而导致无法正常执行,则应确保所使用的SQL语句正确指定了如何应对这种情形下的行为。例如利用`ON DUPLICATE KEY UPDATE`特性可以在检测到主键或唯一索引冲突时更新已有的行而非抛出错误消息[^3]。 ```sql INSERT INTO table_name (id, name) VALUES (1,'Alice') ON DUPLICATE KEY UPDATE name=VALUES(name); ``` 上述代码片段展示了怎样安全地处理可能存在的重复ID情况——即使目标记录已经被占用也会相应修改其name字段的内容而不至于失败退出。 #### 验证数据完整性 有时问题根源在于试图插入不符合预期模式的数据集内;因此有必要事先验证待写入的信息是否满足既定条件限制。比如检查外键关联的有效性、字符长度合规与否等等因素均有可能触发相应的警告提示甚至致命性的中断事件。 另外值得注意的一点是在某些特殊情况下可能会因为隐含转换规则引起意外的结果,故而在编写具体实现之前最好先查阅官方文档确认各类型之间的映射关系以便做出恰当的选择[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

雨云21

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

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

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

打赏作者

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

抵扣说明:

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

余额充值