使用字段约束保证学生信息准确性--目录
前言
字段约束用于限制插入表的数据的类型和数值,以保证这些数据的正确性和完整性,在关系型数据库中一般存在以下六种约束:
- 非空值约束 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 小结
对于是否在数据库层使用约束以确保数据的完整性,可能每个人都持有不同的观点,这里建议大家除外键约束外,其他约束根据业务场景需要适当使用还是利大于弊的,当然将约束放在应用程序中去实现也是可以的。