7.數據完整性

--數據完整性
--(1)數值的完整性,指數據類型與取值的正確性。
--(2)表內數據不相互矛盾。
--(3)表間數據不相互矛盾,指數據的關聯性不被破壞。 
--數據完整性:存儲在數據庫中的所有數據值均爲正確合理的狀態
--實體完整性、域完整性、引用完整性、用戶完整性
--實體完整性
--實體完整性:要求表中每一條記錄(每一行數據)是唯一的,即它必須至少擁有一個惟一標識以區分不同的數據行。 
--實現方法有:主鍵約束PRIMARY KEY、惟一性約束UNIQUE、惟一索引UNIQUE INDEX、標識IDENTITY等 。
--域完整性
--域完整性:限定表中輸入數據的數據類型與取值範圍。 
-- 實現方法:默認值約束DEFAULT或默認對象、覈查約束CHECK、外鍵約束FOREIGN KEY、規則RULE 、數據類型、非空性約束NOT NULL等。
--引用完整性
--引用完整性:指對數據庫迚行添加、刪除、修改數據時,要維護表間數據的一致性。 
--實現方法:外鍵約束FOREIGN KEY、覈查約束CHECK、觸發器TRIGGER、存儲過程PROCEDURE。
--也稱參照完整性,定義外鍵碼和主鍵碼之間的引用規則。
-- 強制引用完整性,Sql Server將防止用戶執行下列操作:
--在主表中沒有關聯行的情況下在相關表中添加或更改行
-- 在主表中更改值(可導致相關表中出現孤立行)
--在有匹配的相關行的情況下刪除主表中的行
--用戶定義完整性
--用戶定義的完整性:用於實現用戶特殊要求的數據規則或格式。
-- 實現方法:默認值DEFAULT、覈查約束CHECK、規則RULE 等。
--規則和默認值
--規則和默認值都是數據庫中的對象。 • 可以把它們綁定到多個數據庫表的列上,也可以綁定到用戶自定義的數據庫類型上,在數據庫內可以共享使用。

--規則對象的基本操作
--創建-》綁定-》驗證-》接觸規則對象綁定-》刪除規則對象

--創建規則
--CREATE RULE [schema_name] rule_name AS condition_expression; 
--• schema_name:規則所屬架構的名稱。
--• rule_name:新規則的名稱。 
--• condition_expression:定義規則的條件。規則可以是WHERE子句中任何有效的表達式,並且可以包括諸如算術運算符、關係運算符和謂詞(如 IN、LIKE、BETWEEN)這樣的元素。
 --規則不能引用列或其他數據庫對象,可以包括不引用數據庫對象的內置函數,不能使用用戶定義函數。 condition_expression包括一個變量。每個局部變量的前面都有一個@符號。
--該表達式引用通過UPDATE或INSERT語句輸入的值。在創建規則時,可以使用任何名稱或符號表示值,但第一個字符必須是@符號。
--例創建一個名爲sex_rule的規則對象,該規則對象要性別只能取‘男’或‘女’
create rule sex_rule as @sex in('男','女')
go

--創建一個名爲age_rule的規則對象,該規則對象數據範圍爲1~120
create rule age_rule as @age>0 and @age<120
go

--綁定規則
--將創建好的規則對象綁定到某個數據表的列上,規則對象纔會起約束作用。
-- 綁定規則對象的語法格式如下:EXEC sp_bindrule '規則對象名', '表名.列名'
--將數據插入到mystudent表中,併爲age綁定規則age_rule
insert into mystudent (stuno,stuname,sex,age,score) values('190101','張三','男',250,100)
exec sp_bindrule 'age_rule','mystudnet.age'

--解除綁定
--解除綁定的命令格式如下:EXEC sp_unbindrule '表名.列名'
--將mystudent表中age的規則解綁
exec sp_unbindrule 'mystudent.age'

--刪除規則
--刪除規則對象的語法格式如下。DROP RULE 規則對象名組
--將mystudent age規則刪除
drop rule age_rule

--默認值對象的基本操作
--創建默認值對象的語法格式如下:CREATE DEFAULT default_name AS condition_expression [;]
 --其中,As子句後面的表達式主要是對於定義的默認值對象賦值
 --默認值對象綁定 exec sp_bindefault ‘默認值對象’,‘表.列’
 --解除綁定 exec sp_unbindefault ‘表.列’
 --刪除默認綁定對象 drop default 默認值對象列表
 --定義默認值放在批處理中
 create default sex_default as '男'
 go

 --綁定默認值
 exec sp_bindefault 'sex_default' ,'mystudent.sex'
 --解除默認值
 exec sp_unbindefault 'mystudnet.sex' 
 --刪除默認值
 drop default sex_default

 --完整性約束
 --① PRIMARY KEY約束② FOREIGN KEY約束③ UNIQUE約束④ CHECK約束⑤ DEFAULT定義⑥ 允許空值
 --primary key 約束
 --一個表通常可以通過一個列或多個列組合的數據來唯一標識表中的每一行,這個列或列的組合就被稱爲表上的主鍵。創建表中的主鍵是爲了保證數據的實體完整性。
 -- PRIMARY KEY (主鍵)約束用於定義基本表的主鍵,它是惟一確定表中每一條記錄的標識符,其值不能爲NULL,也不能重複,以此來保證實體的完整性
 --sql命令創建主鍵
--• create table table_name( column_name data_type [,….n][[constraint constraint_name] primary key [culstered|noclustered] (column_name,[……n]))
--創建一個帶主鍵的教師表,教師編號爲主鍵
create table myteacher(tno char(7) primary key,tname varchar(20))
--創建多個列爲主鍵的表,例如選課表
create table selectLesson(cno char(5),sno char(5),score int ,primary key(cno,sno))
--更改主鍵約束
--添加新列,並設置爲主鍵,原表無主鍵
alter table 表 
    add 列名 類型 primary key[sulstered|noclustered]

--爲表中先有列設置爲主鍵,原表無主鍵
alter table 表
    add constraint 約束名
        primary key [culstered|noclustered] .....

--給存在的表添加主鍵
create table nokey(c1 int,c2 int)
go

--添加新列,並設置爲主鍵
alter table nokey
add c3 int not null primary key 

--創建課程表
create table slesson
(cno char(6) not null , sno char(8) not null,score int)
go

--添加聯合主鍵
alter table slesson
add constraint pk_c_s
primary key (cno,sno)

--刪除主鍵
--ALTER TABLE table_name DROP [CONSTRAINT] primarykey_name
alter table slesson drop pk_c_s

--foreign key 約束
--使用Transact-SQL語句設置外部鍵約束 ,其語法形式如下:
-- CONSTRAINT constraint_name FOREIGN KEY(column_name[,…n])REFERENCES ref_table 
--[(ref_column[,…n])][ON DELETE]{CASCADE|NO ACTION}[ON UPDATA]{CASCADE|NO ACTION}
--爲已創建表添加外鍵約束
ALTER TABLE tablename
ADD [CONSTAINT constraint_name]
FOREIGN KEY(column_name,[…n])
REFRERNCES ref_table(ref_column,[…n]) 
[ON DELETE]{CASCADE|NO ACTION}
[ON UPDATA]{CASCADE|NO ACTION}
--刪除外鍵約束
ALTER TABLE tablename
DROP [CONSTRAINT] constraint_name
--例
create table mylesson
(lessonid char(6) primary key,lessonname varchar(20))
create table mystu
(stuid char(6) primary key,stuname varchar(20))

--創建錶帶外鍵
create table myselect
(lessonid char(6),stuid char(6),score int
constraint fk_le foreign key(lessonid) references mylesson(lessonid)
constraint fk_st foreign key(stuid) references mystu(stuid))

--刪除外鍵
alter table myselect drop constraint fk_le
--給已經存在的表添加外鍵
alter table myselect add constraint fk_st2 foreign key(stuid) references mystu(stuid)

--uniqu約束
--Unique約束指定表中的某列或多個列組合的數據取值不能重複。Unique約束所作用的列不是主鍵例。
-- Primary key約束不unique約束的區別:
--(1)一個表只有一個primary約束,可以有多個unique約束;
--(2)unique約束的列可以爲空,只能有一個空,primary約束的列不能爲空;
--(3)默認情況下,primary約束有聚集索引,unique約束有非聚集索引。
CONSTRAINT constraintname
UNIQUE [clustered|noclustered] 
[columnname][,…n]
--創建unique
create table mycourse
(courseid char(5),coursename varchar(20) constraint myunique unique)

--插入數據測試
insert into mycourse values('001','hello')
insert into mycourse values('002','hello')

--刪除unique
alter table mycourse drop constraint myunique
--爲已經存在的表添加unique
alter table mycourse add constraint myun unique (coursename)
insert into mycourse values('002','hello')

--check約束
--Check約束通過邏輯表達式作用在表中的某些列,用於限制列的取值範圍,以保證數據庫數據的有效性,從而實施完整性約束。
CREATE TABLE tablename
(column datatype [CONSTRAINT constraintname]
CHECK (logical_expression)) 
 ALTER TABLE tablename
 ADD [CONSTRAINT constraintname]
 CHECK (logical_expression)
 --例
 create table mytea
 (tid char(6),tname varchar(10),sex char(4) constraint ck_sex check(sex='男' or sex='女'))

 --測試約束
 insert into mytea values('001','hhh','男')
 insert into mytea values('002','hhh','hh')

 --刪除約束
 alter table mytea drop constraint ck_sex
 --爲已經存在的表添加check約束
 alter table mytea add constraint ck_sex check(sex='男' or sex='女')
 insert into mytea values ('002','hhh','hh')

 --default約束
 --DEFAULT約束用於向列中插入默認值。
 CREATE TABLE tablename(column datatype [CONSTRAINT constraintname] DEFAULT constant_express)
 ALTER TABLE tablename ADD [CONSTRAINT constraintname] DEFAULT constant_express FOR columnname
 --default 創建錶帶默認值
 create table myst
 (stid char(6),sname varchar(10),sex char(2) constraint df default '男')
 insert into myst(stid,sname)values('12','hello')
 select * from myst

 --刪除默認
 alter table myst drop constraint df
 --更改
 alter table myst add constraint df default '男' for sex

 --not null約束
 --NOT NULL約束強制作用列不能取空值。NOT NULL只能約束列。
 --not null 定義
 create table mys(sid char(6) primary key , sname varchar(20) not null)
 insert into mys values('001','aaa')  --正確
 insert into mys(sid) values('002')  --錯
 insert into mys values('003',null)  --錯

 --修改
 create table myt(sid char(6),sname varchar(20))
 alter table myt 
 alter column sname varchar(20) not null

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章