SQL学习笔记----第五天(使用字段约束保证学生信息准确性)

前言

字段约束用于限制插入表的数据的类型和数值,以保证这些数据的正确性和完整性,在关系型数据库中一般存在以下六种约束:

  • 非空值约束 NOT NULL
  • 主键约束 PRIMARY KEY
  • 唯一约束 UNIQUE
  • 外键约束 FOREGIN KEY
  • 检查约束 CHECK
  • 默认值约束:DEFAULT

    字段约束可以在创建表时规定约束(如在 CREATE TABLE 语句中),也可以在表创建之后增加约束(如通过ALTER TABLE语句)。在各主流的数据库中都有各自创建和使用字段约束的语法。并且存在一些细微的差异,下面是MySQL的分支,详细了解下字段约束的新增、使用、和删除。

1.主键约束PRIMARY KEY

主键是用来保证一列或一组列中值是唯一的,它的值唯一标识了所在行,而在原则上不能修改,比如下面是创建一张用户表user_test的语句,表中定义了主键列为id,并且是自增列。

create table user_test(
		id int not null auto_increment primary key,
		name varchar(20) not null)
		ENGINE = InnoDB

一个列被定义为主键,需要满足以下几个条件:

  • 不允许为null值。
  • 列中的值不能出现重复数据,即是唯一值;
  • 作为主键的列不能乱改,虽然有些数据库允许修改,但不建议去这样做,修改主键值容易导致数据的混乱,毕竟它是该行唯一的标识。
    如果创建表(create table)时没有定义主键列,也可以通过alter table 来定义:
alter table user_test add constraint primary key(id);=

上面脚本使用alter table 定义了相同的主键为ID列。

2.外键约束FOREIGN KEY

被定义为外键的列,它的值必须是另外一张表的主键值,比如上面已经创建的用户表 user_test存储了用户的信息,现在再创建一张订单表 order_test,并定义列user_id(用户id)为外键:

craeate table order_test(
	order_id int not null primary key auto_increment.
	create_time varchar(20) not null,
	user_id int not null,
	foregin_key(user_id) references user_test(id)
) ENGINE = INNODB

order_test:表中保存了用户的消费记录,表中每行记录通过用户id(user_id)与user_test 表中的主键列id进行关联。然user_test中的用户id的值是唯一的,但order_test表中的用户id值并不一定为唯一值,因为一个用户可能存在多条消费记录。。但order_test表中的用户id值必须是在user_test中的用户id字段值中存在,否则插入数据时会返回错误提示。

外键约束除了可以保证数据的完整性和正确性外,还有避免意外删除的作用,例如当删除上例用户表order_test中的用户id为1的记录时,由于在订单表order_test中存在用户id为1的订单记录,数据库会返回错误提示而不允许删除。也就是说只有先将订单表order_test中user_id为1的订单记录全部删除后,才可以删除用户表order_

也正是由于外键有这些限制,在现实应用中,外键约束很少被使用,很多开发者会考虑将外键约束做的工作放到应用程序中,这样在一定程度上也减轻了数据库的压力。test中的用户id为1的记录。

3.唯一约束 unique

被定义为唯一约束的列或列组合不能有重复值,虽然唯一约束和主键都具有唯一特性,但两者之间仍存在以下差别:

  • 设置为主键的列或列组合自动拥有uniqe约束;
  • 设置为唯一约束的列或列组合可以填充null值;
  • 一张表可以有多个唯一约束,但只能有一个主键约束;
  • 设置为唯一约束的列或列组合可以修改更新。
    创建一张测试表student_test,字段ID被称为定义主键,学生编号sid被定义为唯一约束列,必须保证学生的编号是唯一值。
create table student_test 
( id int(11)  not null primary key auto_increment,  
   sid   varchar(20) UNIQUE,
   name  varchar(20) not null,
   age int 
) ENGINE=InnoDB  

如果表student_test已经创建,要将学生编号SID设置为唯一约束,就需要使用下列语句:

alter table  student_test add unique (sid)

4.非null值约束not null

被设置为 not null的列不被允许填充null值,如果在向表新增数据时,没有向该约束列填充值,数据库也将提示错误。比如上面创建的表student_test中的姓名字段name不可以填充null值,当向表中新增数据时,也必须向该表填充值。
如果将已创建好的列name 新增 not null约束,就需要保证该列已有值不包含null值,否则将设置不成功。可以使用下面的语句进行新增not not 约束:

alter table student_test modify name varchar(20) not null

5.检查约束:

该约束的作用就是保证一列或列组满足一定的条件,检查约束可以实现以下几种功能:

  • 限制最大值和最小值
  • 将值限制在一定的范围区间内
  • 限值为特定的值
    比如创建表student_test时,年龄字段age被设置检查约束为age>0,即该字段直接大于0的值。
create table student_test
(id int(11) not null primary key auto_increment,
 sid varchar(20) UNIQUE,
 name varchar(20) not null,
 age int check(age>0)
 )ENGINE=InnoDB  

像其他约束一样,也可以通过alter table 来添加检查约束:

alter table student_test add constraint chk_student_test check(age>0)

语句中的chk_student_test 为创建的约束名称;

6.默认值约束DEFAULT

DEFAULT 约束条件是经常见到的一种约束条件,如果我们在创建表时,字段只是定义了数据类型而没有标注默认值,那么该字段默认会拥有default null的约束条件,看下面创建表student_test的例子:

create table student_test 
( id int(11)  not null primary key auto_increment,  
   sid   varchar(20) UNIQUE,
   name  varchar(20) not null,
   age   int default 20 
) ENGINE=InnoDB

上面表创建语句中,将年龄 age 字段的值默认为 20,如果新增数据时,没有向该列填充数据,该字段的值自动填充为 20。使用 alter table 新增default 的格式为:

alter table student_test modify age int default 20

7.删除约束

上面例句中都是讲述如何创建约束条件,那么随着业务的发展变化,可能以前的约束条件不能满足业务员需要,这时就可能会删除这些约束条件,数据库也为我们提供了删除约束条件的SQL:

 alter table 表名 drop primary key -- 删除主键约束   
 alter table 表名 drop [index | key] 唯一约束名 -- 删除唯一性约束   
 alter table 表名 drop foreign key 外键名   -- 删除外键约束   
 alter table 表名 modify 列名 类型  -- 删除not null约束   
 alter table 表名 modify 列名 类型  -- 删除default约束   
 alter table 表名 drop check 约束名 -- 删除check约束 

8 小结

对于是否在数据库层使用约束以确保数据的完整性,可能每个人都持有不同的观点,这里建议大家除外键约束外,其他约束根据业务场景需要适当使用还是利大于弊的,当然将约束放在应用程序中去实现也是可以的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值