码迷,mamicode.com
首页 > 数据库 > 详细

31. SQL -- 完整性及约束(2)

时间:2015-04-03 06:54:02      阅读:254      评论:0      收藏:0      [点我收藏+]

标签:insert   数据表   

唯一性束:

唯一性束(unique constraint)不是数据表内替代的另一个名称而已。替代alternate key)可以是数据表内不作的其他任何列,只要该键对该数据表唯一即可。话说,在唯一列内不允数据重象唯一性束指定一个或多个列的合的具有唯一性,以防止在列中入重。唯一性束指定的列可以有NULL 属性。

法:

CONSTRAINT constraint_name

UNIQUE [CLUSTERED | NONCLUSTERED]

column_name1[, column_name2,…,column_name16]

DEMO1

建国家Country指定国家不能重ID

CREATE TABLE Country

(

cCountryId CHAR(3) PRIMARY KEY, /*省略部分关键字,行级约束,没有指定束名*/

cCountry CHAR(25) NOT NULL UNIQUE ) /*级约束,没有指定束名*/

插入3条数据:

insert into Country

values

(‘A01‘,‘china‘),

(‘A02‘,‘<?xml:namespace prefix="st1">yemen‘?xml:namespace>),

(‘A03‘,‘IR‘)

果:

select * from Country

新插入一条数据,在列cCountry中指一条记录与之前插入记录值相同的数

insert into Country

values (‘A04‘,‘china‘)

出下如下错误

消息2627级别14,状1,第2

反了UNIQUE KEY ‘UQ__Country__62A4127E20C1E124‘。不能在‘dbo.Country‘ 中插入重复键

句已止。

DEMO2:若表已建,通ALTER TABLEUNIQUE

alter table country

add constraint UQ_Country_cCountry unique (cCountry)

/*级约*/

形化界面建:

数据 → 表 → 设计选择创束的列 → 右 → 索引/

 

CHECK束:

CHECK (CHECK :列中可接受的数据检查约束通限制插入列中的施域完整性。可以在一列上定多个检查约束。它按照定的次序被施。当束被定成表级时一的检查约束可以被用到多列,也可以将多个 CHECK 用于个列。当除去某个表,也将除去 CHECK 束。

CHECK束的限制:

1 CHECK 束不接受FALSE 。因UNKNOWN,所以表达式中存在可能会覆盖束,例如,假设对int MyColumn 用一个束,指定 MyColumn 只能包含10(即 MyColumn = 10)。如果将NULL 插入到 MyColumn,数据引擎将插入 NULL 且不返回错误

2 、如果 CHECK 检查的条件于表中的任何行都不是 FALSE,它将返回 TRUE。如果刚创建的表没有任何行,此表的任何 CHECK 束都视为有效

3 DELETE 验证CHECK 束。因此,使用特定型的 CHECK DELETE 可能会生意外

DEMO设对CheckTbl 行下列句。

INSERT INTO CheckTbl VALUES (10, 10)

GO

DELETE CheckTbl WHERE col1 = 10;

即使 CHECK 束指定表 CheckTbl 至少包含 1 行,DELETE 句也会成功

法:

CONSTRAINT constraint_name

CHECK [NOT FOR REPLICATION]

(logical_expression)

CHECK束可以同下列关键字或命令一起指定:

IN关键

使用IN 关键字可以确保:入的被限制在一个常数表达式列表中。

例如:下列命令在表Shopper的列cCity建了CHECKchkCity这样就能将入限制在合法的城市中。

CREATE TABLE Shopper

(

cCity CHAR(15) NOT NULL CONSTRAINT chkCity CHECK(cCity IN (‘Boston‘, ‘Chicago‘,

Dallas,‘New York‘, ‘Paris‘,‘Washington‘))

)

LIKE关键

使用LIKE关键字可以通通配符来确保入某一列的符合一定的模式。

例如:

CHECK (cShopperId LIKE [0-9][0-9][0-9][0-9] [0-9][0-9])

上述CHECK束指定[0-9]——[0-9],之只能包含六位数

BETWEEN 关键

可以通BETWEEN关键字来指明常数表达式的范中包括上限和下限

例如:

CHECK (siToyQoh BETWEEN 0 AND 100)

上述CHECK束指定了属性siToyQoh只能在0100

Check时应遵循的规则

它可以在列或表级创建。

它用来限制可以插入到列的

它可以包含用自定的搜索条件。

它不能包含子查询

如果指定了WITH NOCHECK选项,就不检查已有数据。

它可以引用同一表中的其他列

DEMO:限制表tb2中列silowerage>=2,列siupperage<=100

alter table tb2

add constraint CK_tb2_silowerage

check (silowerage >=2)

alter table tb2

add constraint CK_tb2_siupperage

check (siupperage <=100)

当插入数check,返回如下错误

insert into tb2

values(‘p0001‘,‘bus‘,‘A-B1‘,‘BIG‘,‘150.00‘,‘P01‘,null,1,100,null,null)

消息547级别16,状0,第1

INSERT 句与CHECK "CK_tb2_silowerage"冲突。冲突生于数据"demo_db",表"dbo.tb2", column ‘silowerage‘

句已止。

insert into tb2

values(‘p0001‘,‘bus‘,‘A-B1‘,‘BIG‘,‘150.00‘,‘P01‘,null,4,101,null,null)

消息547级别16,状0,第1

INSERT 句与CHECK "CK_tb2_siupperage"冲突。冲突生于数据"demo_db",表"dbo.tb2", column ‘siupperage‘

句已止。

使用形化界面CHECK束:

数据 → 表 → 设计选择列 → 右check

缺省:

缺省束可用于某列指定一个常数这样就不需要为该列插入。只能在一列上建一个缺省束,且列不能是IDENTITY列。

缺省束通列的默认值或使用数据的默认值对定表的列,来指定列的默认值SQL Server 推荐使用缺省束,而不使用定认值的方式来指定列的默认值

法:

CONSTRAINT constraint_name

DEFAULT constant_expression [FOR column_name]

DEMO:在ShoppercCity属性上DEFAULT束。如果没有指定城市,属性cCity将缺省地包含―Chicago

CREATE TABLE Shopper

(

cCid int,cCity char(15) DEFAULT ‘Chicago‘

)

如果表已经创建,但没有指定缺省,可以用ALTER TABLE命令来指定缺省:

alter table shopper

add constraint DF_Shopper_cCity default ‘gddg‘ for cCity

除缺省束:

alter table shopper

drop constraint DF_Shopper_cCity

 

本文出自 “Ricky's Blog” 博客,请务必保留此出处http://57388.blog.51cto.com/47388/1627842

31. SQL -- 完整性及约束(2)

标签:insert   数据表   

原文地址:http://57388.blog.51cto.com/47388/1627842

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!