天天看點

mysql CONSTRANT(限制) 複習

限制(Constraint)是Microsoft SQL Server 提供的自動保持資料庫完整性的一種方法,定義了可輸入表或表的單個列中的資料的限制條件(有關資料完整性的介紹請參見第9 章)。在SQL Server 中有5 種限制:主關鍵字限制(Primary Key Constraint)、外關鍵字限制(Foreign Key Constraint)、惟一性限制(Unique Constraint)、檢查限制(Check Constraint)和預設限制(Default Constraint)。

1 主關鍵字限制

主關鍵字限制指定表的一列或幾列的組合的值在表中具有惟一性,即能惟一地指定一行記錄。每個表中隻能有一列被指定為主關鍵字,且IMAGE 和TEXT 類型的列不能被指定為主關鍵字,也不允許指定主關鍵字列有NULL 屬性。

定義主關鍵字限制的文法如下:

CONSTRAINT constraint_name

PRIMARY KEY [CLUSTERED | NONCLUSTERED]

(column_name1[, column_name2,…,column_name16])

各參數說明如下:

constraint_name

指定限制的名稱限制的名稱。在資料庫中應是惟一的。如果不指定,則系統會自動生成一個限制名。

CLUSTERED | NONCLUSTERED

指定索引類别,CLUSTERED 為預設值。其具體資訊請參見下一章。

column_name

指定組成主關鍵字的列名。主關鍵字最多由16 個列組成。

例7-3: 建立一個産品資訊表,以産品編号和名稱為主關鍵字

create table products (

p_id char(8) not null,

p_name char(10) not null ,

price money default 0.01 ,

quantity smallint null ,

constraint pk_p_id primary key (p_id, p_name)

) on [primary]

2 外關鍵字限制

外關鍵字限制定義了表之間的關系。當一個表中的一個列或多個列的組合和其它表中的主關鍵字定義相同時,就可以将這些列或列的組合定義為外關鍵字,并設定它适合哪個表中哪些列相關聯。這樣,當在定義主關鍵字限制的表中更新列值,時其它表中有與之相關聯的外關鍵字限制的表中的外關鍵字列也将被相應地做相同的更新。外關鍵字限制的作用還展現在,當向含有外關鍵字的表插入資料時,如果與之相關聯的表的列中無與插入的外關鍵字列值相同的值時,系統會拒絕插入資料。與主關鍵字相同,不能使用一個定義為 TEXT 或IMAGE 資料類型的列建立外關鍵字。外關鍵字最多由16 個列組成。

定義外關鍵字限制的文法如下:

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 ]

各參數說明如下:

REFERENCES

指定要建立關聯的表的資訊。

ref_table

指定要建立關聯的表的名稱。

ref_column

指定要建立關聯的表中的相關列的名稱。

ON DELETE {CASCADE | NO ACTION}

指定在删除表中資料時,對關聯表所做的相關操作。在子表中有資料行與父表中的對應資料行相關聯的情況下,如果指定了值CASCADE,則在删除父表資料行時會将子表中對應的資料行删除;如果指定的是NO ACTION,則SQL Server 會産生一個錯誤,并将父表中的删除操作復原。NO ACTION 是預設值。

ON UPDATE {CASCADE | NO ACTION}

指定在更新表中資料時,對關聯表所做的相關操作。在子表中有資料行與父表中的對應資料行相關聯的情況下,如果指定了值CASCADE,則在更新父表資料行時會将子表中對應的資料行更新;如果指定的是NO ACTION,則SQL Server 會産生一個錯誤,并将父表中的更新操作復原。NO ACTION 是預設值。

NOT FOR REPLICATION

指定列的外關鍵字限制在把從其它表中複制的資料插入到表中時不發生作用。

例7-4:建立一個訂貨表,與前面建立的産品表相關聯

create table orders(

order_id char(8),

p_id char(8),

p_name char(10) ,

constraint pk_order_id primary key (order_id) ,

foreign key(p_id, p_name) references products(p_id, p_name)

) on [primary]

注意:臨時表不能指定外關鍵字限制。

惟一性限制

惟一性限制指定一個或多個列的組合的值具有惟一性,以防止在列中輸入重複的值。惟一性限制指定的列可以有NULL 屬性。由于主關鍵字值是具有惟一性的,是以主關鍵字列不能再設定惟一性限制。惟一性限制最多由16 個列組成。

定義惟一性限制的文法如下:

CONSTRAINT constraint_name

UNIQUE [CLUSTERED | NONCLUSTERED]

(column_name1[, column_name2,…,column_name16])

例7-5:定義一個員工資訊表,其中員工的身份證号具有惟一性。

create table employees (

emp_id char(8),

emp_name char(10) ,

emp_cardid char(18),

constraint pk_emp_id primary key (emp_id),

constraint uk_emp_cardid unique (emp_cardid)

) on [primary]

7.2.4 檢查限制

檢查限制對輸入列或整個表中的值設定檢查條件,以限制輸入值,保證資料庫的資料完整性。可以對每個列設定符合檢查。

定義檢查限制的文法如下:

CONSTRAINT constraint_name

CHECK [NOT FOR REPLICATION]

(logical_expression)

各參數說明如下:

NOT FOR REPLICATION

指定檢查限制在把從其它表中複制的資料插入到表中時不發生作用。

logical_expression

指定邏輯條件表達式傳回值為TRUE 或FALSE。

例7-6: 建立一個訂貨表其中定貨量必須不小于10。

create table orders(

order_id char(8),

p_id char(8),

p_name char(10) ,

quantity smallint,

constraint pk_order_id primary key (order_id),

constraint chk_quantity check (quantity>=10) ,

) on [primary]

注意:對計算列不能作除檢查限制外的任何限制。

7.2.5 預設限制

預設限制通過定義列的預設值或使用資料庫的預設值對象綁定表的列,來指定列的預設值。SQL Server 推薦使用預設限制,而不使用定義預設值的方式來指定列的預設值。有關綁定預設限制的方法請參見“資料完整性”章節。

定義預設限制的文法如下:

CONSTRAINT constraint_name

DEFAULT constant_expression [FOR column_name]

例7-7:

constraint de_order_quantity default 100 for order_quantity

注意:不能在建立表時定義預設限制,隻能向已經建立好的表中添加預設限制。

7.2.6 列限制和表限制

對于資料庫來說,限制又分為列限制(Column Constraint)和表限制(Table Constraint)。

列限制作為列定義的一部分隻作用于此列本身。表限制作為表定義的一部分,可以作用于

多個列。

下面舉例說明列限制與表限制的差別。

例7-8:

create table products (

p_id char(8) ,

p_name char(10) ,

price money default 0.01 ,

quantity smallint check (quantity>=10) ,

constraint pk_p_id primary key (p_id, p_name)

繼續閱讀