約束(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 ]
[ on update ] ]
[ not for replication ]
各引數說明如下:
references
指定要建立關聯的表的資訊。
ref_table
指定要建立關聯的表的名稱。
ref_column
指定要建立關聯的表中的相關列的名稱。
on delete
指定在刪除表中資料時,對關聯表所做的相關操作。在子表中有資料行與父表中的對應資料行相關聯的情況下,如果指定了值cascade,則在刪除父表資料行時會將子表中對應的資料行刪除;如果指定的是no action,則sql server 會產生乙個錯誤,並將父表中的刪除操作回滾。no action 是預設值。
on update
指定在更新表中資料時,對關聯表所做的相關操作。在子表中有資料行與父表中的對應資料行相關聯的情況下,如果指定了值cascade,則在更新父表資料行時會將子表中對應的資料行更新;如果指定的是no action,則sql server 會產生乙個錯誤,並將父表中的更新操作回滾。no action 是預設值。
not for replication
指定列的外關鍵字約束在把從其它表中複製的資料插入到表中時不發生作用。
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) /* 表約束 */
約德爾測試
l1 raw input l2 raw input l3 for i in range len l1 if l1 i isalpha or l1 i isdigit else sum 0 for j in range len l3 if l3 j l2 j sum 1 ratio sum float...
約德爾測試
約德爾測試 題目描述 蘭博和提莫閒聊之後,回歸到了他們的正題,約德爾人的未來。說起約德爾人的未來,黑默丁格曾經提出了乙個約德爾測試,將約德爾人的歷史的每個階段都用乙個字元表達出來。包括可寫字元,不包括空格。然後將這個字串轉化為乙個01串。轉化規則是如果這個字元如果是字母或者數字,這個字元變為1,其它...
約德爾測試
只需要判斷歷史字串中對應的應該用1還是0來表示就解決問題。1.接受輸入的可以是字元陣列 char 也可以是字串 string 2.判斷是字母或者數字的時候要用 而不能用連續不等號,這是出錯點 3.相除的時候保證是float型,就要確保運算的過程有float型的變數或者常量參與運算 4.保留小數字數 ...