Constraint5:unique 约束和null
大家知道,关系型数据库的逻辑运算的结果是三值型的,TRUE,FALSE和UNKNOWN,特别是,NULL值和任何值都不相等,任何值和NULL的比较,返回的逻辑结果都是unknown。而NULL值在唯一约束和Check约束中的表现,不同于NULL值的定义。
唯一(Unique)约束在内部使用唯一索引来保证列值的唯一性。在一个列上创建唯一约束(unique)之后,该列允许插入null值,通常情况下,两个null值是不相等的,但是在唯一约束中,unique约束把两个null值看作是相同的,也就是说,null和null是相等的,null和其他任何非null值都不相等。
Check约束用以限制单列的可能取值范围,在check约束中(check(expression)),如果expression返回的结果是Unknown,那么check约束返回的结果是true。这就意味着,如果expression的值是null,那么该表达式的值满足check约束。
一,唯一约束
唯一约束可以创建在列级别上,也可以在表级别上。在列级别上, default 约束定义的语法是:分为column level和table level,区别在于Table Level需要制定unique约束影响的column(or columns)。
列级别定义的唯一约束的语法是:
column_name <data_type>[ CONSTRAINT constraint_name ] UNIQUE
表级别定义的唯一约束的语法是:
[ CONSTRAINT constraint_name ] UNIQUE(column [ ASC | DESC ] [ ,...n ] )
二,向现有表上增加唯一约束
1,增加unique约束
alter table dbo.dt_test_unique
add constraint uq_test_id unique nonclustered(id)
2,删除unique约束
alter table dbo.dt_test_unique
drop constraint uq_test_id
3,修改unique约束
不能在现存的表上修改unique约束,变通的方法是先删除 unique约束,后增加一个新的unique约束
alter table dbo.dt_test_unique
drop constraint uq_test_id alter table dbo.dt_test_unique
add constraint uq_test_id unique nonclustered(id)
三,Check约束
Check约束用以限制单列的可能取值范围,需要在Check约束中指定逻辑表达式,该逻辑表达式必须返回逻辑值(TRUE或FALSE),在Check中,把UNKNOWN值认为是TRUE。
check(expression)
1,在check约束中
如果expression返回的结果是Unknown,那么check返回的结果是true。
create table dbo.dt_check
(
id int null constraint ck_ID_is_Positive check(id>0)
)
插入数据,测试check约束的工作机制
insert into dbo.dt_check
values(null)
insert into dbo.dt_check
values(1)
insert into dbo.dt_check
values(0)
INSERT 语句与 CHECK 约束"ck_ID_is_Positive"冲突。该冲突发生于数据库"db_study",表"dbo.dt_check", column 'id'。
语句已终止。
NULL和1 插入成功,而0插入失败。
2,在表级别上定义Check约束
在表级别上定义Check约束,可以对多列的可能取值进行限制
create table dbo.dt_check
(
id int null ,
code int null,
constraint ck_IDCode_is_Positive check(id>0 and code >0)
)
在一个已经创建的table上,通过alter table命令来增加、修改和删除check约束,添加的约束是表级别的约束
3,增加check约束
alter table dbo.dt_check
add constraint ck_ID_is_Positive check(id>0)
4,删除check约束
alter table dbo.dt_check
drop constraint ck_ID_is_Positive
5,修改Check约束
没法直接修改Check约束,变通方法是:必须先删除约束,然后添加新的check约束
alter table dbo.dt_check
drop constraint ck_ID_is_Positive alter table dbo.dt_check
add constraint ck_ID_is_Positive check(id>0)
6,通过alter table命令增加新的列,并在列级别上创建check 约束
alter table dbo.dt_check
add sex char(1) not null
constraint ck_sex check(sex in('M','F'))
参考文档:
table_constraint (Transact-SQL)
Constraint5:unique 约束和null的更多相关文章
- SQL CREATE TABLE 语句\SQL 约束 (Constraints)\SQL NOT NULL 约束\SQL UNIQUE 约束
CREATE TABLE 语句 CREATE TABLE 语句用于创建数据库中的表. SQL CREATE TABLE 语法 CREATE TABLE 表名称 ( 列名称1 数据类型, 列名称2 数据 ...
- postgresql数据库primary key约束/not null约束/unique约束及default值的添加与删除、列的新增/删除/重命名/数据类型的更改
如果在建表时没有加primary key约束.not null约束.unique约束.default值,而是创建完表之后在某个字段添加的话 1.primary key约束的添加与删除 给red_pac ...
- SQL语句建表、设置主键、外键、check、default、unique约束
· 什么是数据库? 存放数据的仓库. · 数据库和数据结构有什么区别? 数据结构要解决在内存中操作数据的问题,数据库要解决在硬盘中操作数据的问题.数据结构研究一些抽象数据模型(ADT)和以及定义在该模 ...
- oracle的unique约束
unique约束是唯一性约束,对于需要列类型应用程序会重复出现分歧值.您可以加入一个单独的列unique约束.能够加入多个列unique约束().假设为多个列加入一个unique约束,仅仅须要保证这多 ...
- sql unique约束详解
UNIQUE 约束唯一标识数据库表中的每条记录. UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证. PRIMARY KEY 拥有自动定义的 UNIQUE 约束. 请注意 ...
- SQLServer之UNIQUE约束
UNIQUE约束添加规则 1.唯一约束确保表中的一列数据没有相同的值. 2.与主键约束类似,唯一约束也强制唯一性,但唯一约束用于非主键的一列或者多列的组合,且一个表可以定义多个唯一约束. 使用SSMS ...
- SQL UNIQUE 约束
SQL UNIQUE 约束 UNIQUE 约束唯一标识数据库表中的每条记录. UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证. PRIMARY KEY 拥有自动定义的 ...
- SQLServer 中有五种约束, Primary Key 约束、 Foreign Key 约束、 Unique 约束、 Default 约束和 Check 约束
一直在关注软件设计方面,数据库方面就忽略了很多,最近在设计数据库时遇到了一些小麻烦,主要是数据库中约束和性能调优方面的应用,以前在学习 Sql Server 2000,还有后来的 Sql Server ...
- 关于数据库主从表、主键PRIMARY KEY 外键约束 FOREIGN KEY 约束----NOT NULL,DEFAULT,CHECK
如果由两个列共同组成主键,而且一个子表将主键作为可为空值的外键来继承,就可能得到错误的数据.可在一个外键列中插入有效的值,但在另一个外键列中插入空值.然后,可添加一个数据表检查约束,在可为空的外键中检 ...
随机推荐
- 编译原理词法分析 java简单实现
package com.csray; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundEx ...
- iPhone/iPad/Android UI尺寸规范 UI尺寸规范,UI图标尺寸,UI界面尺寸,iPhone6尺寸,iPhone6 Plus尺寸,安卓尺寸,iOS尺寸
iPhone/iPad/Android UI尺寸规范 UI尺寸规范,UI图标尺寸,UI界面尺寸,iPhone6尺寸,iPhone6 Plus尺寸,安卓尺寸,iOS尺寸 iPhone界面尺寸 设备 分辨 ...
- CentOS 6.5 Nginx 配置
1.安装所有 http功能: ./configure --user=www-data --group=www-data --with-http_ssl_module --with-http_reali ...
- mac新手的烦恼
最近新换了mac,我换mac并非自愿.无论mac的性能有多好,我依然讨厌使用appstore下载软件的感觉,尤其在我一遍又一遍忘记自己的appID的时候.无奈我的thinkpad常常死机,最近又常倒腾 ...
- ASCII和16进制对照表
十六进制代码 MCS 字符或缩写 DEC 多国字符名 ASCII 控制字符 1 00 NUL 空字符 01 SOH 标题起始 (Ctrl/A) 02 STX 文本起始 (Ctrl/B) 03 ETX ...
- xcode8 升级后注释快键键不能使用的解决方法
1.这个是因为苹果解决xcode ghost.把插件屏蔽了.解决方法 命令运行: sudo /usr/libexec/xpccachectl 然后必须重启电脑后生效 2.option+command ...
- Torch7学习笔记(二)nn Package
神经网络Package [目前还属于草稿版,等我整个学习玩以后会重新整理] 模块Module module定义了训练神经网络需要的所有基础方法,并且是可以序列化的抽象类. module有两种状态变量: ...
- C#编写windows服务
项目要求: 数据库用有一张表,存放待下载文件的地址,服务需要轮训表将未下载的文件下载下来. 表结构如下: 过程: VS--文件-->新建项目-->windows-->windows服 ...
- Spring AOP实例——异常处理和记录程序执行时间
实例简介: 这个实例主要用于在一个系统的所有方法执行过程中出线异常时,把异常信息都记录下来,另外记录每个方法的执行时间. 用两个业务逻辑来说明上述功能,这两个业务逻辑首先使用Spring AOP的自动 ...
- java并发编程(十八)阻塞队列和阻塞栈
阻塞队列 阻塞队列是Java 5并发新特性中的内容,阻塞队列的接口是java.util.concurrent.BlockingQueue,它有多个实现类:ArrayBlockingQueue.Dela ...