30. SQL -- 完整性及约束(1)
完整性及約束
?
數據完整性:
數據完整性是指數據的精確性和可靠性。它是應防止數據庫中存在不符合語義規定的數據和防止因錯誤信息的輸入輸出造成無效操作或錯誤信息而提出的。SQL Server 提供了一些工具來幫助用戶實現數據完整性,其中最主要的是:約束(Constraint)、和觸發器(Trigger)。
數據完整性約束主要包括四大類:
實體完整性?
域完整性
引用完整性
用戶自定義完整性
實體完整性:
實體完整性指的是關系數據庫中所有的表都必須有主鍵,而且表中不允許存在如下的記錄。
u 無主鍵值的記錄
u 主鍵值相同的記錄
在SQL Server 中可以通過建立PRIMARY KEY約束、UNIQUE 約束、唯一索引和列的IDENTITY屬性等措施來實施實體完整性。
引用完整性:
引用完整性有時也稱為參照完整性,引用完整性就是描述實體之間關系的。這種限制一個表中某列的取值受另一個表的某列的取值范圍約束的特點就稱為引用完整性。在關系數據庫中用外鍵(Foreign key 有時也稱為外部關鍵字)來實現引用完整性。
域完整性
域完整性或語義完整性。確保了只有在某一合法范圍內的值才能存儲到一列中。可以通過限制數據類型、值的范圍和數據格式來實施域完整性。在SQL Server 中可以通過默認值、Foreign KEY、CHECK 等約束來實施域完整性
用戶自定義完整性
用戶自定義完整性就是針對某一具體應用領域定義的數據約束條件,它反映某一具體應用所涉及的數據必須要滿足應用語義的要求。
如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 NULL。PRIMARY 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)
需將列id、co1 定義為主鍵,由于id 是屬于自增列,因此默認屬性不為空,co1 默認是樂允許空,因此使用alter table 命令修改列co1 參數為not null
alter table tb1
alter column co1 char(10) not null
定義主鍵約束,對列字段id、co1 進行約束
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 p_w_picpath,
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 語句。
CASCADE、SET 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)
圖形化界面創建外鍵約束:
數據庫 → 表 → 設計 → 選擇所需創建外鍵的列 → 右鍵 → 關系
?
轉載于:https://blog.51cto.com/57388/1627841
總結
以上是生活随笔為你收集整理的30. SQL -- 完整性及约束(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: fragment的基本使用
- 下一篇: FastDFS5.02安装说明