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

30. SQL -- 完整性及约束(1)

时间:2015-04-03 06:53:44      阅读:280      评论:0      收藏:0      [点我收藏+]

标签:可靠性

完整性及

 

数据完整性:

数据完整性是指数据的精确性和可靠性。它是防止数据中存在不符合语义规定的数据和防止因错误信息的出造成无效操作或错误信息而提出的。SQL Server 提供了一些工具来帮助用户实现数据完整性,其中最主要的是:束(Constraint)、和触器(Trigger)。

数据完整性束主要包括四大

体完整性 

域完整性

引用完整性

自定完整性

体完整性:

体完整性指的是系数据中所有的表都必有主,而且表中不允存在如下的记录

u 无主键值记录

u 键值相同的记录

SQL Server 中可以通建立PRIMARY KEY束、UNIQUE 束、唯一索引和列的IDENTITY属性等措施来体完整性。

引用完整性:

引用完整性有也称参照完整性,引用完整性就是描述体之间关系的。这种限制一个表中某列的取受另一个表的某列的取围约束的特点就称引用完整性。在系数据中用外Foreign key 也称外部关键)实现引用完整性。

域完整性

域完整性或语义完整性。确保了只有在某一合法范内的才能存到一列中。可以通限制数据型、的范和数据格式来施域完整性。在SQL Server 中可以通认值Foreign KEYCHECK 束来施域完整性

自定完整性

自定完整性就是针对某一具体域定的数据束条件,它反映某一具体用所及的数据必语义的要求。

check(age between 10 and100)

 

束:

束(Constraint)是Microsoft SQL Server 提供的自保持数据完整性的一方法,定了可入表或表的个列中的数据的限制条件。在SQL Server 中有5 种约束:

关键束(Primary Key Constraint

关键束(Foreign Key Constraint

唯一性束(Unique Constraint

检查约束(Check Constraint

缺省束(Default Constraint)。

 

关键Primary Key Constraint):

的作用:

是一个表中能标识唯一行的志(也有其他方法表示唯一行,如唯一列)。主主要用在查询单调数据,修改单调数据和单调数据上。

一般做程序的候,都将表的主键设int 型的可自增的列,这样程的候,很容易区分数据。

关键束中(称主键约束)指定表的一列或几列的合的在表中具有唯一性,即能唯一的指定一行记录。主键约束确保体完整性。一个表中最多有一个主.使用PRIMARY KEY,列的空属性必义为NOT NULLPRIMARY KEY束可以用于表中一列或多列,用于多列,它被定义为PRIMARY KEY束,否被定义为PRIMARY KEY.SQL Server 动为实PRIMARY KEY束的列建立唯一索引。如果在PRIMARY KEY束中未指定索引,默情况下所建立的索引簇索引(CLUSTERED)。索引只能过删PRIMARY KEY束或其相表的方法来除,而不能使用DROP INDEX

除。无是建立列PRIMARY KEY是表PRIMARY KEY束,个表只能建一个PRIMARY KEY束。

法如下:

CONSTRAINT constraint_name

PRIMARY KEY [CLUSTERED | NONCLUSTERED]

column_name1[, column_name2,…,column_name16]

列的数据型不限,但此列必是唯一并且非空。

表中已有主键为1000 的行,不能再添加主键为1000

建主有几方式:

束子句

束子句

ALTER TABLE

束子句:

[ CONSTRAINT constraint_name ]

PRIMARY KEY [ CLUSTERED | NONCLUSTERED ]

[ WITH [ FILLFACTOR = fillfactor ] ]

[ ON { filegroup | DEFAULT } ]

一般在建表指定列,明确指定

create table tb7

(

txcode char(10) primary key,

docno char(20),

docseq smallint,

part varchar(30),

txqty numeric(12,4)

)

束子句:

[ CONSTRAINT constraint_name ]

PRIMARY KEY [ CLUSTERED | NONCLUSTERED ]

{ column [,...n] }

[ WITH [ FILLFACTOR = fillfactor ] ]

[ ON { filegroup | DEFAULT } ]

PRIMARY KEY束定中,WITH 子句PRIMARY KEY束所建立索引的面填充度,ON 子句指出存索引的数据文件名称。

束子句是在表定义结尾定键约束。表束子句是CREATE TABLE 句的一部分,如果束子句有错误,整个句将失,表不会被建。

create table tb8

(txcode char(10),

docno char(20),

docseq smallint,

part varchar(30),

txqty numeric(12,4),

CONSTRAINT [pk_tb8] PRIMARY KEY CLUSTERED

(

[txcode] ASC,

[docno] ASC,

[docseq] ASC

)

)

束子句允包括多个束,使用分隔一个束定

ALTER TABLE 句:

建了一表,可以使用alter table 句管理束、增加列、改参数。行功能 ALTER

Add a constraint  ALTER TABLE table_name ADD CONSTRAINT etc

Drop a constraint  ALTER TABLE table_name DROP CONSTRAINT etc

Disable a constraint ALTER TABLE table_name DISABLE CONSTRAINT etc

Enable a constraint ALTER TABLE table_name ENABLE CONSTRAINT etc

建表tb1:

create table tb1

(id int identity(1,1),

co1 char(10),

co2 varchar(30),

co3 varchar(40),

co4 bit)

需将列idco1 义为,由于id 是属于自增列,因此默属性不空,co1 空,因此使用alter table 命令修改列co1 参数not null

alter table tb1

alter column co1 char(10) not null

键约束,列字段idco1

alter table tb1

add constraint PK_id primary key

(id,co1)

看表详细情况:

sp_help tb1

自增列:

自增列的应为int bigint 型。可以置起始和增数

如:

create table [table1]

(

id int identity(1,1),

co1 varchar(20)

)

如上代次插入数值时,列id 初始1,然后依次

除其中某条数据(如id=10,再次插入数据id 从将11 始,即使用一次后,不会再使用第二次。

例:建表table1,插入10 条数据

create table [table1]

(

id int identity(1,1),

co1 varchar(20)

)

insert into table1

values( ‘abc‘)

go 10

现删除第10 条数据:

delete from table1

where id = 10

再次插入10 条数据:

insert into table1

values( ‘abc‘)

go 10

select * from table1

除主键约束:

alter table tb1

drop constraint pk_id

键约束:

关键束(称外键约束)定了表之系。当一个表中的数据依于另一个表中的数据,你可以使用外键约束避免两个表之的不一致性。FOREIGN KEY表中一列或多列料提供参照完整性。FOREIGN KEY,要求在被参照表中定PRIMARY KEY束或UNIQUE 束。FOREIGN KEY束限制插入到表中被束列的在被参照表中已存在。

法:

CONSTRAINT constraint_name

FOREIGN KEY column_name1[, column_name2,…,column_name16]

REFERENCES ref_table [ ref_column1[,ref_column2,…, ref_column16] ]

[ ON DELETE { CASCADE | NO ACTION } ]

[ ON UPDATE { CASCADE | NO ACTION } ] ]

[ NOT FOR REPLICATION ]

FOREIGN KEY 束的定格式

[ CONSTRAINT constraint_name ]

FOREIGN KEY [ ( column [,...n] ) ]

REFERENCES ref_table [ ( ref_column [,...n] ) ]

[ NOT FOR REPLICATION ]

FOREIGN KEY 束的定格式

[ CONSTRAINT constraint_name ]

[ FOREIGN KEY ]

REFERENCES ref_table [ ( ref_column ) ]

[ NOT FOR REPLICATION ]

其中,ref_table 被参照表,ref_column 指出被参照表中的被参照列。被参照表中必具有 PRIMARY KEY 束和UNIQUE 束。

FOREIGN KEY 束中,FOREIGN KEY 子句中指定的列数和列的数据型必REFERENCES 子句中的相同。于列FOREIGN KEY 束,由于参照列唯一确定,所以可以省略,而只需指出被参照列即可。

例:建表tb2,在列cBrandld键约束,能照表Toybradn中列cBrandld.

create table tb2

(

ctoyid varchar(10),

vtoyname varchar(20),

vtoydescription varchar(20),

ccategoryld varchar(20),

mtoyrate money,

cBrandld char(3) references Toybradn(cBrandld),

imphoto image,

silowerage smallint,

siupperage smallint,

sitoyweight smallint,

vtoyimgpath varchar(50)

)

插入2 行数

insert into tb2

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

insert into tb2

values(‘p0001‘,‘bus‘,‘A-B1‘,‘BIG‘,‘150.00‘,‘S01‘,null,3,4,null,null)

当一条数中列cBrandld 在表Toybradn 中列cBrandld 不存在,出下面错误

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

INSERT 句与FOREIGN KEY "FK__tb2__cBrandld__1A14E395"冲突。冲突生于数据"demo_db",表"dbo.Toybradn",

column ‘cBrandld‘

句已止。

当引用外键约,若出下列操作:

NO ACTION

指定如果试图删/修改某一行,而行的被其他表的有行中的外所引用,则产错误并回DELETE/UPDATE 句。

CASCADESET NULL SET DEFAULT

过删除或更新键值来影响指定具有外键关系的表,些外键关系可追溯到在其中行修改的表。如果表也定级联引用操作,那指定的级联操作也将用于除或更新的那些行。不能具有 timestamp 列的外或主指定

CASCADE

ON DELETE CASCADE

指定如果试图删除某一行,而行的被其他表的有行中的外所引用,也将除所有包含那些外的行。

ON UPDATE CASCADE

指定如果试图更新某一行中的键值,而行的键值被其他表的有行中的外所引用,则组成外的所有也将更新到为该键指定的新(如果 timestamp 列是外或被引用的一部分,不能指定 CASCADE)

ON DELETE SET NULL

指定如果试图删除某一行,而行的被其他表的有行中的外所引用,则组成被引用行中的外的所有将被NULL。目表的所有外列必,此束才可行。

ON UPDATE SET NULL

指定如果试图更新某一行,而行的被其他表的有行中的外所引用,则组成被引用行中的外的所有将被NULL。目表的所有外列必,此束才可行。

ON DELETE SET DEFAULT

指定如果试图删除某一行,而行的被其他表的有行中的外所引用,则组成被引用行中的外的所有将被的默认值。目表的所有外列必具 有默认值,此束才可行。如果某个列可,并且未式的默认值会使用 NULL 为该列的式默认值。因 ON DELETE SET DEFAULT 置的任何非空在主

表中必对应,才能维护键约束的有效性。

ON UPDATE SET DEFAULT

定如果试图更新某一行,而行的被其他表的有行中的外所引用,则组成被引用行中的外的所有将被的默认值。目表的所有外列必具 有默认值,此束才可行。如果某个列可,并且未式的默认值会使用 NULL为该列的式默认值。因 ON UPDATE SET DEFAULT 置的任何非空在主表

中必对应,才能维护键约束的有效性。

DEMO

若表已存在,且未定键约束,可使用ALTER TABLE 来定键约束:

alter table tb2

add constraint FK_tb2_cBandid

foreign key

(cBrandld) references Toybradn (cBrandld)

形化界面建外键约束:

数据 → 表 → 设计选择所需建外的列 → 右

 

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

30. SQL -- 完整性及约束(1)

标签:可靠性

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

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