--============================================================
SQL SERVER 中使用constraint和role来对数据进行限制,role需要先创建,再应用到指定的表和列上,role可以被应用到多个对象上。而constraint只能针对单一对象,处理的问题更多一些,constraint可以跨越多个表处理,如限制某个表中输入的值不能大于另一表的最大值,role无法实现这样的需求。通常优先考虑使用constraint来实现对数据的限制。
SQL Server中约束有:
check constraint
unique constraint
primary key constraint
default constraint
可以使用
SELECT * FROM SYS.default_constraints
SELECT * FROM sys.check_constraints
select * from sys.key_constraints
来查看约束
--============================================================
完整性检查顺序
1. 应用适当的默认值
2. 检查NOT NULL
3. check constraint
4. 对引用表的外键约束
5. 对被引用表的外键约束
6. 唯一或主键约束
7. 触发器
--============================================================
约束的一些Demo
--====================================== --创建表时创建check约束 CREATE TABLE TB14 ( ID INT IDENTITY(1,1), C1 INT, CONSTRAINT chk_TB14_C1 CHECK(C1>0) ) --====================================== --修改表创建check约束 CREATE TABLE TB15 ( ID INT IDENTITY(1,1), C1 INT ) ALTER TABLE TB15 ADD CONSTRAINT chk_TB15_C1 CHECK(C1>0) --====================================== --修改表创建check约束,并且不检查已有数据 CREATE TABLE TB15 ( ID INT IDENTITY(1,1), C1 INT ) INSERT INTO TB15(C1) SELECT -1 ALTER TABLE TB15 WITH NOCHECK ADD CONSTRAINT chk_TB15_C1 CHECK(C1>0) --====================================== --禁用已有约束 ALTER TABLE TB15 NOCHECK CONSTRAINT chk_TB15_C1 INSERT INTO TB15(C1) SELECT -1 --====================================== --启用用已有约束 ALTER TABLE TB15 CHECK CONSTRAINT chk_TB15_C1
--=============================================== --在创建表时指定主键,并且生出非聚簇索引 CREATE TABLE TB16 ( ID INT IDENTITY(1,1), C1 INT NOT NULL, CONSTRAINT pk_TB15_ID PRIMARY KEY NONCLUSTERED(ID) ) --在新建主键或唯一约束是,使用WITH NOCHECK来避免检查当前数据 --默认条件下主键约束会附带生成聚簇索引,而唯一约束会附带生成非聚簇索引。
--============================== --在表创建时使用DEFAULT 约束 CREATE TABLE TB12 ( ID INT IDENTITY(1,1), C1 INT DEFAULT 0 ) --============================== --在修改表时使用DEFAULT 约束 CREATE TABLE TB13 ( ID INT IDENTITY(1,1), C1 INT NOT NULL, C2 INT NOT NULL ) ALTER TABLE TB13 ADD CONSTRAINT DF_TB13_ID DEFAULT 0 FOR C1 --======================================= --在插入时显式使用默认值 INSERT INTO TB12(C1) VALUES(DEFAULT) --======================================= --在插入时隐式使用默认值 INSERT INTO TB13(C2) VALUES(1) --======================================= --在更新时显式使用默认值 UPDATE TB12 SET C1=DEFAULT
--====================================== --创建表时创建check约束 CREATE TABLE TB14 ( ID INT IDENTITY(1,1), C1 INT, CONSTRAINT chk_TB14_C1 CHECK(C1>0) ) --====================================== --修改表创建check约束 CREATE TABLE TB15 ( ID INT IDENTITY(1,1), C1 INT ) ALTER TABLE TB15 ADD CONSTRAINT chk_TB15_C1 CHECK(C1>0) --====================================== --修改表创建check约束,并且不检查已有数据 CREATE TABLE TB15 ( ID INT IDENTITY(1,1), C1 INT ) INSERT INTO TB15(C1) SELECT -1 ALTER TABLE TB15 WITH NOCHECK ADD CONSTRAINT chk_TB15_C1 CHECK(C1>0) --====================================== --禁用已有约束 ALTER TABLE TB15 NOCHECK CONSTRAINT chk_TB15_C1 INSERT INTO TB15(C1) SELECT -1 --====================================== --启用用已有约束 ALTER TABLE TB15 CHECK CONSTRAINT chk_TB15_C1