約束1 什麼是約束

2022-02-18 09:34:57 字數 2920 閱讀 4967

約束(constraint)使使用者可以定義資料庫引擎執行資料完整性的方式,就是說,約束定義了有關列中允許的值的規則,強制資料表保持資料的完整性,表資料必須符合一定的條件。因為約束跟表資料有十分密切的關係,因此,通常在表定義中建立約束。事實上,表是資料庫物件,約束也是一種特殊的資料庫物件,只不過用於實現資料的完整性。在關係型資料庫中,資料的完整性主要分為三類:

域完整性:資料值符合標準,相關的約束是:check約束,預設值約束(default),非空約束(not null);

綜上所述,共有六種型別的約束,約束型別分別是:

除非空約束之外,每乙個約束都是乙個資料庫物件,有名稱,存在於sys.objects中,而非空約束比較特殊,不是乙個資料庫物件,沒有名稱,一般可以把非空屬性作為列的屬性,不把not null/null作為約束看待。

一,約束是資料庫物件

由於約束是資料庫物件,所有的約束都處於特定的資料庫架構(internal)中,因此,處於同乙個schema下的約束的名稱不能重複,每乙個約束的名稱必須是唯一的。

通常情況下,約束的schema是其父物件(表)的架構。

1,約束不能同名

例如,在兩個表中建立兩個同名的約束:

create

table

dbo.dt_test

( id

intidentity

notnull

constraint pk_id primary

key,

)create

table

dbo.dt_test_add

( id

intidentity

notnull

constraint pk_id check(id>0),

)

當建立第二個約束時,sql server引擎丟擲錯誤訊息:

there is already an object named 'pk_id' in the database. could not create constraint. see previous errors.

2,檢視約束物件

通過sys.objects 檢視約束物件的資訊,每乙個約束物件都必須依附在表物件上,稱作約束的父物件。

select name as

constraint_name

,object_id

asconstraint_id

,schema_name(schema_id)

asschema_name

,object_name(parent_object_id) as

parent_object_name

,type_desc

asconstraint_type

from

sys.objects

where type in('

c','

d','

f','

pk','

uq')

三,特殊的列屬性

跟約束有關的兩個列屬性是 identity和 nullability,當使用select into命令建立資料表的乙個副本時,資料列的名稱和資料型別都會複製過去,同時 identity和 nullability也會複製過去,但是其他5個約束物件的屬性不會複製到新錶中。這也是為什麼不把非空約束(not null)作為約束來看待的原因。

四,約束的預設行為

主鍵約束(primary key)和唯一約束(unique)都具有唯一性,實際上兩者都會建立乙個唯一索引,通過唯一索引來保證唯一性。這兩個約束的不同點是:

五,應用約束的順序

一般情況下,sql server引擎按照如下順序應用約束:

預設值約束,如果字段沒有顯式賦值,應用defaut約束,為字段賦值;

非空約束,檢查欄位的值是否not null;

check約束,檢查欄位的值是否滿足check約束;

外來鍵約束:檢查字段是否存在外來鍵;

唯一性約束:最後,檢查欄位的值是否滿足唯一約束(unique)和主鍵約束;

六,約束的檢查

通過alter table命令,可以禁用或啟用約束,也可以不檢查現有資料。

1,對於已經存在的資料

在向乙個表中新新增約束(check約束或外來鍵約束)之後,要檢查表中已經存在的資料是否滿足約束,可以使用with check選項,該選項用於對錶中現存的資料進行約束的檢查;而with nocheck選項,是指對錶中現存的資料不進行約束的檢查,因為現存的資料可能不滿足新建的約束,因此,建議使用with check選項。

2,對於新增加的資料

約束對於新增加的資料,都會做檢查該資料是否滿足約束。

alter

table

schema_name . table_name

[with

] constraint

3,約束的啟用或禁用

選項:constraint,用於啟用或禁用指定的約束(check約束或外來鍵約束),當nocheck選項指定之後,後續的insert或update操作不會做check和外來鍵約束的檢查。

預設值(default)、主鍵(primary key)和唯一(unique)約束不能被禁用。

constraints

alter table (transact-sql)

約束rmq 1RMQ(約束RMQ)

1rmq其實是rmq的乙個特殊情況,它的特殊性體現在 序列中每兩個相鄰元素的差是1或 1。即 對於這種特殊情況,有一種方法可以將rmq的時間降至常數級別,即用 的時間解決。可以發現,如果lca用dfs rmq的方法解決,則rmq部分正好是 1rmq。所以,如果會了這種方法,將可以用 這裡簡單 因為我...

xml schema約束入門(1)

book type xs string 三國演義 這樣就定義乙個xml schema 這裡的意思是 定義了乙個標籤為名字book 型別為string 型別其中elemet,name,type為固定格式,value是自己定義的部分。tyep的值xml schema 提供了一些基本的型別提供你們使用 s...

fpga電平約束有什麼作用 FPGA約束的詳細介紹

1 約束的目的 介紹fpga約束原理,理解約束的目的為設計服務,是為了保證設計滿足時序要求,指導fpga工具進行綜合和實現,約束是vivado等工具努力實現的目標。所以首先要設計合理,才可能滿足約束,約束反過來檢查設計能否滿足時序。主要涉及到xilinx vivado xdc約束語法,給出對應的is...