约束-保证数据完整性(数据检查)

l  先用设计器创建约束、再用代码创建约束。

l  数据库约束是为了保证数据的完整性(正确性)而实现的一套机制

l  见文件Employee.sql

l  非空约束

l  主键约束(PK) primary key constraint 唯一 且 不为空

l  唯一约束 (UQ)unique constraint 唯一,允许为空,但只能出现一次(右键—索引键---选择列(是否唯一),可以位Null 但nul自能出现一次)

l  默认约束 (DF)default constraint 默认值

l  检查约束 (CK)check constraint 范围以及格式限制(右键---check约束—写表达式(xingbie=‘男’ or xingbie=‘女’))

l  外键约束 (FK)foreign key constraint 表关系:保证外键值来源于主键

l  增加外键约束时,设置级联更新、级联删除:(在主外键关系上可以设置级联更新、级联删除)慎用级联删除

  • [ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
  • [ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]

 

 

当创建了主外键关系后,如果在外键表中有任何记录引用了主键表中的某条记录,则在主键表中不能删除该记录。同时主键表也不能删除。

 

新建一张表:员工信息表

View Code
  1 create table Employees
  2 
  3 (
  4 
  5     EmpId int identity(1,1),
  6 
  7     EmpName varchar(50),
  8 
  9     EmpGender char(2),
 10 
 11     EmpAge int,
 12 
 13     EmpEmail varchar(100),
 14 
 15     EmpAddress varchar(500)
 16 
 17 )
 18 
 19  
 20 
 21  
 22 
 23 create table Department
 24 
 25 (
 26 
 27     DepId int identity(1,1) primary key,
 28 
 29     DepName varchar(50) unique not null
 30 
 31 )
 32 
 33  
 34 
 35 Drop table Employees
 36 
 37  
 38 
 39 select * from Employees
 40 
 41  
 42 
 43 --============手动增加约束==========
 44 
 45 --手动删除一列(删除EmpAddress列)
 46 
 47 alter table Employees drop column EmpAddress
 48 
 49 --手动增加一列(增加一列EmpAddr varchar(1000))
 50 
 51 alter table Employees add EmpAddr11 varchar(500),AA int ,bb varchar(10)
 52 
 53 --手动修改一下EmpEmail的数据类型(varchar(200))
 54 
 55 alter table Employees alter column EmpAddr varchar(1000)
 56 
 57  
 58 
 59 --为EmpId增加一个主键约束
 60 
 61 alter table Employees add constraint PK_EmpId primary key(EmpId)
 62 
 63  
 64 
 65 --非空约束,为EmpName增加一个非空约束
 66 
 67 alter table Employees alter column EmpName varchar(50) not  null
 68 
 69  
 70 
 71 --为EmpName增加一个唯一约束
 72 
 73 alter table Employees add constraint UQ_EmpName unique(EmpName)
 74 
 75  
 76 
 77 --为性别增加一个默认约束,默认为'男'
 78 
 79 alter table Employees add constraint DF_EmpGender default('') for EmpGender
 80 
 81  
 82 
 83 --为年龄增加一个检查约束:年龄必须在-120岁之间,含岁与岁。
 84 
 85 alter table Employees add constraint CK_EmpAge check(EmpAge >=0 and EmpAge<=120)
 86 
 87  
 88 
 89 --创建一个部门表,然后为Employee表增加一个DepId列。
 90 
 91 alter table Employees add DeptId int
 92 
 93  
 94 
 95 --增加外键约束
 96 
 97 alter table Employees add constraint FK_DeptId_DepId foreign key(DeptId) references Department(DepId)
 98 
 99  
100 
101  
102 
103  
104 
105  
106 
107  
108 
109  
110 
111  
112 
113 --添加主键约束
114 
115 alter table Score
116 
117 add constraint  PK_Score primary key(sId)
118 
119  
120 
121  
122 
123 --添加唯一约束
124 
125 alter table student
126 
127 add constraint UQ_student unique(sNo)
128 
129  
130 
131  
132 
133 --添加默认约束
134 
135 alter table student
136 
137 add constraint DF_student default('') for sSex
138 
139  
140 
141 --添加检查约束
142 
143 alter table student
144 
145 add constraint CK_student check(sAge >=18 and sAge <=100)
146 
147  
148 
149 --添加外键约束(主键表Class 外键表student)
150 
151 alter table student
152 
153 add constraint FK_student
154 
155 foreign key(sClassId) references Class(cId) --外键student表中的sClassId来references引用主键表中的cid
156 
157 --级联删除
158 
159 --on delete cascade on update cascade
160 
161  
162 
163  
164 
165 --删除约束
166 
167 alter table student
168 
169 drop constraint FK_student
170 
171  
172 
173 --用一条语句为表增加多个约束。
174 
175 alter table Employees add
176 
177 constraint PK_Employees_EmpId primary key(EmpId),--增加主键约束
178 
179 constraint UQ_Employees_EmpName unique(EmpName),--增加唯一约束
180 
181 constraint DF_Employees_EmpGender default('') for EmpGender,--默认约束
182 
183 constraint CK_Employees_EmpAge check(EmpAge>=0 and EmpAge<=120),
184 
185 constraint FK_Employees_Department_DepId foreign key(DepId) references Department(DepId)
186 
187  
188 
189  
190 
191  
192 
193 alter table Employees drop constraint
194 
195 CK_Employees_EmpAge,
196 
197 FK_Employees_DepId
198 
199  
200 
201 ====================================================================================================
202 
203 通过使用级联引用完整性约束,您可以定义当用户试图删除或更新现有外键指向的键时,SQL Server 2005 执行的操作。
204 
205 CREATE TABLE 语句和 ALTER TABLE 语句的 REFERENCES 子句支持 ON DELETE 子句和 ON UPDATE 子句。还可以使用“外键关系”对话框定义级联操作:
206 
207 [ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]__
208 
209 [ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]__
210 
211  
212 
213 --删除原有的外键约束
214 
215 alter table Employees drop constraint FK_Employees_Department_DepId
216 
217  
218 
219 --设置主外键关系的级联删除
220 
221 alter table Employees add constraint FK_Employees_Department_DepId
222 
223 foreign key(DepId) references Department(DepId)
224 
225 on delete CASCADE --设置级联删除
226 
227 --on update cascade --设置级联更新
228 
229  
230 
231  

 

如果没有指定 ON DELETE 或 ON UPDATE,则默认为 NO ACTION。

ON DELETE NO ACTION 指定如果试图删除某一行,而该行的键被其他表的现有行中的外键所引用,则产生错误并回滚 DELETE 语句。

ON UPDATE NO ACTION 指定如果试图更新某一行中的键值,而该行的键被其他表的现有行中的外键所引用,则产生错误并回滚 UPDATE 语句。

CASCADE、SET NULL 和 SET DEFAULT 允许通过删除或更新键值来影响指定具有外键关系的表,这些外键关系可追溯到在其中进行修改的表。如果为目标表也定义了级联引用操作,那么指定的级联操作也将应用于删除或更新的那些行。不能为具有 timestamp 列的外键或主键指定 CASCADE。

ON DELETE CASCADE 指定如果试图删除某一行,而该行的键被其他表的现有行中的外键所引用,则也将删除所有包含那些外键的行。

ON UPDATE CASCADE 指定如果试图更新某一行中的键值,而该行的键值被其他表的现有行中的外键所引用,则组成外键的所有值也将更新到为该键指定的新值。

注意: 如果 timestamp 列是外键或被引用键的一部分,则不能指定 CASCADE。

ON DELETE SET NULL 指定如果试图删除某一行,而该行的键被其他表的现有行中的外键所引用,则组成被引用行中的外键的所有值将被设置为 NULL。为了执行此约束,目标表的所有外键列必须可为空值。

ON UPDATE SET NULL 指定如果试图更新某一行,而该行的键被其他表的现有行中的外键所引用,则组成被引用行中的外键的所有值将被设置为 NULL。为了执行此约束,目标表的所有外键列必须可为空值。

ON DELETE SET DEFAULT 指定如果试图删除某一行,而该行的键被其他表的现有行中的外键所引用,则组成被引用行中的外键的所有值将被设置为它们的默认值。为了执行此约束,目标表的所有外键列必须具有默认定义。如果某个列可为空值,并且未设置显式的默认值,则将使用 NULL 作为该列的隐式默认值。因 ON DELETE SET DEFAULT 而设置的任何非空值在主表中必须有对应的值,才能维护外键约束的有效性。

ON UPDATE SET DEFAULT 指定如果试图更新某一行,而该行的键被其他表的现有行中的外键所引用,则组成被引用行中的外键的所有值将被设置为它们的默认值。为了执行此约束,目标表的所有外键列必须具有默认定义。如果某个列可为空值,并且未设置显式的默认值,则将使用 NULL 作为该列的隐式默认值。因 ON UPDATE SET DEFAULT 而设置的任何非空值在主表中必须有对应的值,才能维护外键约束的有效性。

 

TopDistinct

l  Top 获取前几条数据,top一般都与order by连用

  • 获得年纪最小的5个学生
  • 获得年纪最大的10%的学生

l  Distinct 去除重复数据

  • select distinct sName from student
  • select distinct sName,sAge from student

l  Select top 5 sName,sAge from student

l  Select top 30 percent sName,sAge from student  非四舍五入,返回最大整数 2.1 返回3

技巧

调试:把语句分割成几行语句 再点击错误提示就可以知道那行出错

可以直接在列的字段拖进SQL语句里面

 

posted on 2013-01-03 00:06  陈谨  阅读(153)  评论(0编辑  收藏  举报