约束是通过限制列中数据、行中数据以及表之间数据取值从而保证数据完整性的非常有效和简便的方法。
1.主键约束(primary key)
Primary key 约束在表中定义一个主键,唯一的标识表中的行。一个表中只能有一个主键约束。SQL server将检查列中现有的数据以确保现有数据遵从主键的规则,即无空值,无重复值。一个表中只能有一个主键,不能为空。
(1)利用SQL创建主键
在创建表时创建主键约束
Createtable [数据表名]
( 列名数据类型 [constraint约束名] primary key)
createtableStudent
(
Snonchar(20)notnullconstraintPK_Snoprimarykey,--主键
Snamenchar(10)notnull,--姓名
Ssexnchar(4)null, --性别
Sageintnull, --年龄
Sdeptnchar(10) --所在系
)
(2)删除主键约束
alter table 表名 drop constraint 约束名
alter table Student dropconstraint PK_Sno
(3)给已存在的表添加主键
alter table 表名 add[constraint约束名] primary key (字段)
altertableStudent
add constraintPK_Snoprimarykey(Sno)
2.唯一键约束(UNIQUE)
可使用UNIQUE约束确保非主键中不输入重复值。在允许空值的列上保证唯一性时,应使用UNIQUE约束而 不是primary key约束,不过在该列中只允许一个NULL值,一个表中可以定义多个唯一性约束,但只能定义一个 主键约束。
(1)创建唯一性约束
create table 数据表名
(列名数据类型 constraint 约束名 unique)
createtableCourse
(
CnointnotnullconstraintPK_Conprimarykey, --课程号不为空
Cnamenchar(20)notnullconstraintUQ_Cnameunique,--课程名(非主键)唯一
Ccreditintnotnull, --学分
)
(2)删除唯一性束
alter table 表名 drop constraint约束名
例如:删除课程表中课程名的唯一键限制
alter table Course dropconstraintUQ_Cname
(3)给已存在的表添加唯一性束
alter table 表名 add[constraint约束名] unique (字段)
例如:将课程表中课程号设为唯一键约束
altertableCourse
addconstraintUQ_Cnameunique(Cname)
3.检查约束(CHECK)
限制用户输入某一列的数据取值,即该列只输入一定范围的数据。
(1)创建检查约束
create table 表名
(列名数据类型 constraint 约束名 check (逻辑表达式))
例如:创建学生成绩表,将成绩限制在0到100之间
createtableSC --学生成绩表
(
Snonchar(20), --学号
Cnoint, --课程号
Cgradenumeric(4,1) constraint CK_Cgrade check(Cgrade>= 0 and Cgrade <= 100) --成绩(限制在0到100之间)
)
(2)删除检查约束
alter table 表名 drop constraint约束名
例如:删除成绩约束
alter table SC dropconstraintCK_Cgrade
(3)给已存在的表添加检查约束
alter table 表名 add[constraint约束名] check (字段)
例如:将成绩表中成绩设为检查约束
altertable SC
add constraint CK_Cgrade check (Cgrade>= 0andCgrade<= 100)
4.默认值约束(default)
默认约束是指在用户未提供某些列的数据时,数据库系统为用户提供的默认值。
(1)创建默认值约束
create table 表名
(列名数据类型 constraint 约束名 default (默认值))
例如:创建学生系别表,默认值为计算机科学与技术系
createtable Department
(
Sno nchar(20), --学号
Depname nchar(30) constraint DF_Depname default ('计算机科学与技术') --系别
)
(2)删除默认约束
alter table 表名 drop constraint 约束名
例如:删除所在系别约束
alter table Department drop constraint DF_Depname
(3)给已存在的表添加默认约束
alter table 表名 add[constraint约束名] fefault (字段) for 列名
例如:将系别表中系别设为默认约束
altertable Department
add constraint DF_Depname default('计算机科学与技术') f or Depname
5.外键约束(froeign key)
外键约束使用于加强两表之间一列或多列数据的联系。
a.外键表的数据必须与主键表的数据一致
b.如果主键表的数据修改(删除),那么外键的数据也跟着修改(删除)
c.如果外键表与主键表相对应的数据,那么主键表中的数据不能修改或删除
d.如果删除次表中的外键所在列,则主表不影响
如果删除主表中的主键数据(作为外键使用列),如果次表中外键数据存在则不能删除
createtableScore
(
课程号 int not null primarykey,
分数 int
)
createtable course
(
学号 int not null primarykey,
课程号 int,
foreign key (课程号) references Score(课程号) --课程号叫做外键coure中引用Score表中的主键课程号
)
主表
insert into Score(课程号,分数) values(1111,50)
insert into Score(课程号,分数) values(2222,60)
insert into Score(课程号,分数) values(3333,70)
insert into Score(课程号,分数) values(4444,80)
insert into Score(课程号,分数) values(5555,90)
次表
insert into course(学号,课程号) values(2014401,1111)
insert into course(学号,课程号) values(2014404,2222)
insert into course(学号,课程号) values(2014405,4444)
(1)insert into course (学号,课程号) values (2014406,6666)
报错,因为主表中没有课程号为6666的,course中课程号的值只能选择在主表Score中的值
(2)delete from course where 课程号 = 1111
主表中课程号1111记录没删除,次表中数据删除
(3)delete from Score where 课程号= 2222
不能删除主表中的数据,因为此表中有数据存在