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
如果由两个列共同组成主键,而且一个子表将主键作为可为空值的外键来继承,就可能得到错误的数据.可在一个外键列中插入有效的值,但在另一个外键列中插入空值.然后,可添加一个数据表检查约束,在可为空的外键中检 ...
随机推荐
- [转]retina屏下支持0.5px边框的情况
2014-12-31更新:截至到IOS8.1,safari仍不支持@supports待safari支持@supports, 就可以利用0.5px了! 2014-7-25更新:1. 修正dpr = 1. ...
- 【JBOSS】 JBOSS目录结构
JBOSS在默认情况下可以用3种方式启动minimal,default和all.三种模式内部的模块数量依次递增 例如: 1-执行JBOSS_HOME/bin/run.bat批量处理文件启动JBos ...
- MSSQL数据库表加锁
所指定的表级锁定提示有如下几种: 1. HOLDLOCK: 在该表上保持共享锁,直到整个事务结束,而不是在语句执行完立即释放所添加的锁. 2. NOLOCK:不添加共享锁和排它锁,当这个选项生效后,可 ...
- 前端面试那些坑之HTML篇
HTML 1.Doctype作用?标准模式与兼容模式各有什么区别? (1).<!DOCTYPE>声明位于位于HTML文档中的第一行,处于<html> 标签之前.告知浏览器的解析 ...
- ADO.NET-SqlHelper
class Sqlhelper { //数据库连接字符 private static string connstr = ConfigurationManager.ConnectionStrings[& ...
- Codeforces Round #384 (Div. 2)D-Chloe and pleasant prizes
D. Chloe and pleasant prizes time limit per test 2 seconds memory limit per test 256 megabytes input ...
- WEB前端工程师(实践)制作天气预报难度:简单
需要准备:jQuery Bootstrap 天气预报API(本文中使用API可能会失效请灵活运用) CSS样式可以你自己去写这里只提出jQuery 请求数据和解析JSON数据 { "resu ...
- JQuery实现Ajax应用
将自己之前在印象笔记的笔记搬家了~ 1.使用 load()方法异步请求数据,通过Ajax 请求加载服务器中的数据,并把返回的数据放置到指定的元素中,它的调用格式为: load(url,[data],[ ...
- Ubuntu系统下lnmp环境搭建和Nginx多站点配置
最近需要使用Ubuntu作为服务器搭建Lnmp环境,顺便将操作过程写下来,与大家分享.如有不足之处,欢迎大家提出不同意见.(本文默认读者已经熟悉相关linux命令的使用,比如创建文件和文件夹,编辑文件 ...
- 利用GeoIP数据库及API进行地理定位查询
GeoIP数据库下载地址:http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz. 首先,在Max ...