8.5 检查约束
检查约束check可以强制数据的完整性,check约束类似foreign key约束,可以控制放入列的值。
例如,定义一个age年龄字段,可以添加check约束,将age列中值的范围限制在0~100之间,这样可以防止输入的年龄值超出正常年龄范围。
8.5.1 在创建表时添加检查约束
在一个数据表中,检查约束可以有多个,但是每一列只能设置一个检查约束。
create table table_name
(
column_name1 datatype check(expression),
colunm_name2 datatype,
column_name3 datatype
)
各参数说明:
- check:检查约束关键字;
- expression:约束表达式,可以是一个条件,也可以是多个条件。例如,设置该列的值大于10,那么表达式为column_name1>10;如果设置该列的值为10~20,就可以将表达式写为column_name1>10 and column_name1<20。
例:在创建水果信息表时,给水果价格列添加检查约束,要求水果的价格大于0小于20:
create table fruits_04
(
id int primary key,
name varchar(20),
price decimal(6,2) check (price>0 and price<20),
origin varchar(20),
remark varchar(200)
)

💡注意:
检查约束可以帮助数据表检查数据,确保数据的正确性,但是也不能给数据表中的每一列都设置检查约束,否则就会影响数据表中数据操作的效果。
因此,在给表设置检查约束前,也要尽可能地确保设置检查余数是否真有必要。
8.5.2 在现有表中添加检查约束
如果在创建表时忘了添加,可以使用alter语句来更新
alter table table_name
add [constraint ck_name] check (expression)
各参数说明:
- table_name:指定添加约束的表名
- constraint ck_name:添加检查约束的名称,可省略
- check :检查约束关键字
- expression:表达式
例:向表fruits_02的price字段添加检查约束,要求水果的价格在10~25元之间:
alter table fruits_02
add constraint ck_price check (price>10 and price<25)

8.5.3 删除检查约束
当不再需要约束时,可以删除约束
alter table table_name
drop constraint ck_name
各参数说明:
- ck_name:指明需要删除的约束名称
例:把上一小节添加的检查约束删除掉:
alter table fruits_02
drop ck_price

8.6 唯一约束
唯一约束(unique)确保在非主键列中不输入重复的值。
根据unique约束,表中的任何两行都不能有相同的列值。
另外,主键也强制实施唯一性,但主键不允许null值。
8.6.1 在创建表时添加唯一约束
在SQL Server中,除了使用primary key可以提供唯一约束之外,使用unique约束也可以指定数据的唯一性,主键约束在一张表中只能有一个,unique约束则可以在一张表中给多列设置唯一性。
语法如下:
create table table_mame
(
column_name1 datatype unique,
column_name2 datatype,
column_name3 datatype
)
各参数说明:
- unique:唯一约束关键字
例:在数据库mydatabase中创建一张水果表,要求为名称列添加唯一约束,确保输入的水果名称不重复:
create table fruits_05
(
id int primary key,
name varchar(20) unique,
price decimal(6,2),
origin varchar(20)
)

💡注意:
unique和primary key的区别:
一张表中可以有多个字段声明unique,但只能有一个字段是primary key声明;
声明为主键的字段不能有空值,但是声明唯一约束的字段可以存在null。
8.6.2 在现有表中添加唯一约束
在现有表中添加唯一约束的方法只有一种,而且在添加时,必须保证该列中不存在重复值。
语法如下:
alter table table_name
add [constraint uq_nama] unique(col_name)
各参数说明:
- table_name:指定要添加约束的表名;
- constraint uq_name:添加名称为uq_name的约束,可省略;
- unique:唯一约束关键字;
- col_name:添加约束的字段名。可以安排多列,用逗号分隔,此时就必须省略掉约束名称,让系统自动为之命名;
例:为表fruits的name字段和origin字段都添加唯一约束
alter table fruits
add unique (name,origin)

8.6.3 删除唯一约束
不再使用的唯一约束可以删除
alter table table_name
drop constraint uq_name
💡提示:同时声明的多字段唯一约束在删除时,也是同时被删除
8.7 非空约束
列的非空性决定表中的行是否允许该列包含空值。
空值(或null)不同于零、空白或为零的字符串,null的意思是没有输入,出现null通常表示值未知或未定义。
8.7.1 在创建表时添加非空约束
非空约束通常都是在创建表时就添加了,添加非空约束的操作很简单,只需要直接在后面加上 not null。
create table table_name
(
column_name1 datatype not null,
column_name2 datatype,
column_name3 datatype
)
例:新建表persons_01,将姓名和出生年月两列设置为非空约束:
create table persons_01
(
id int primary key,
name varchar(20) not null,
birth datetime not null,
info varchar(200)
)

8.7.2 在现有表中添加非空约束
当创建好表后,也可以为其添加非空约束:
alter table table_name
alter column col_name datatype not null
各参数说明:
- col_name:要添加约束的表名;
- datatype:该列的数据类型,如果不修改,也要把原数据类型带上;
- not null:非空约束关键字
例:向现有表fruits中的name列添加非空约束
alter table fruits
alter column name varchar(50) not null

8.7.3 删除非空约束
删除非空约束并不像之前删除别的约束那样使用drop,而是采用另一种傻瓜方式,说出来可能你不信,请看语法:
alter table fruits
alter column name varchar(50) null
是的!我没有写错,你再仔细看看。

被折叠的 条评论
为什么被折叠?



