约束-保证数据完整性(数据检查)
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 } ]
当创建了主外键关系后,如果在外键表中有任何记录引用了主键表中的某条记录,则在主键表中不能删除该记录。同时主键表也不能删除。
新建一张表:员工信息表
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 而设置的任何非空值在主表中必须有对应的值,才能维护外键约束的有效性。
Top、Distinct
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语句里面