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

--=============================================== --在创建表时指定主键,并且生出非聚簇索引 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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现