TSQL--约束基础和Demo

--============================================================

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
 
View Code
 --===============================================
--在创建表时指定主键,并且生出非聚簇索引
CREATE TABLE TB16
(
   ID INT IDENTITY(1,1),
   C1 INT NOT NULL,
   CONSTRAINT pk_TB15_ID PRIMARY KEY NONCLUSTERED(ID)
)

--在新建主键或唯一约束是,使用WITH NOCHECK来避免检查当前数据
--默认条件下主键约束会附带生成聚簇索引,而唯一约束会附带生成非聚簇索引。
View Code
--==============================
--在表创建时使用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
View Code
--======================================
--创建表时创建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
 
 
 
View Code

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。