1. 什麼是Constraint?
Constraint為限制哪一些資料才能儲存至表格中之語法,因此返回的資料必須遵循這個準則。而這些限制語法可以在表格初創時藉由CREATE TABLE語句來指定一列或多列共用一個限制語法,或是之後藉由ALTER TABLE語句來指定。
2. 常見的Constraint之分類
● not null(非空值限制):在預設的情況下,一個欄位是允許有null值的。所以,如果不允許某個欄位含有null值,就必須對那個欄位做出not null的指定。
範例-建立員工資料表(Employee),並限制主鍵與First_Name、Last_Name不能為空值:
create table Employee
(EID integer not null primary key,
First_Name varchar(15) not null,
Last_Name varchar(15) not null,
Address varchar(30));
● unique(唯一值限制):保證一個欄位中的所有資料皆是不重複的值。而一個被指定為主鍵的欄位也一定會含有unique的特性,但是一個unique的欄位並不一定會是一個主鍵,需注意!!
建置新表格時設定「唯一限制」的方式:
create table Employee
(EID integer not null unique,
Last_Name varchar(30),
First_Name varchar(30));
建置新表格時替「唯一限制欄位命名與多欄位」的方式:
create table Employee
(EID integer not null,
Last_Name varchar(30) not null,
First_Name varchar(30) not null,
Address varchar(30),
constraint stu_Employee_Id unique (EID, Last_Name, First_Name));
※限制EID及Last_Name、First_Name這三個欄位為唯一限制,constraint後面接著的即是此「多欄位組合成唯一鍵的名稱」。
改變現有表格架構來「設定唯一限制」的方式:
alter table Employee add unique (EID);
改變現有表格架構來「設定唯一限制欄位命名與多欄位」的方式:
alter table Employee add constraint stu_Employee_Id unique (EID, Last_Name, First_Name);
改變現有表格架構來「移除唯一限制」的方式:
alter table Employee drop constraint stu_Employee_Id;
● check(檢查限制):保證一個欄位中的所有資料都是符合某些條件。例如:Age integer check(Age>0)。
建置新表格時設定「檢查限制」的方式:
create table Employee
(EID integer not null check (EID>0),
Last_Name varchar(30),
First_Name varchar(30));
建置新表格時替「檢查限制欄位命名與多欄位」的方式:
create table Employee
(EID integer not null,
Last_Name varchar(30) not null,
First_Name varchar(30) not null,
Address varchar(30),
constraint chk_Employee check (EID>0 and Last_Name != ‘XXX’));
改變現有表格架構來「設定檢查限制」的方式:
alter table Employee add check (EID>0);
改變現有表格架構來「設定多欄位的檢查限制」的方式:
alter table Employee add constraint chk_Employee check (EID>0 and Last_Name != ‘XXX’);
改變現有表格架構來「移除檢查限制」的方式:
alter table Employee drop constraint chk_Employee;
● primary key(主鍵限制):Primary Key中的每一筆資料都是表格中的唯一值。一個資料表中只能有一個primary key,但是可以有多個unique。主鍵可以包含一或多個欄位,所以當主鍵包含多個欄位時,又稱之為組合鍵 (Composite Key)。
建置新表格時設定「主鍵」的方式:
create table Employee
(EID integer not null primary key,
Last_Name varchar(30),
First_Name varchar(30));
建置新表格時替「主鍵命名與多欄位的組合鍵」的方式:
create table Employee
(EID integer not null,
Last_Name varchar(30) not null,
First_Name varchar(30) not null,
Address varchar(30),
constraint stu_Employee_Id primary key (EID, Last_Name, First_Name));
改變現有表格架構來「設定主鍵」的方式:
alter table Employee add primary key(EID);
改變現有表格架構來「設定主鍵限制欄位命名與多欄位」的方式:
alter table Employee add constraint stu_Employee_Id primary key (EID, Last_Name, First_Name);
改變現有表格架構來「移除主鍵」的方式:
alter table Employee drop constraint stu_Employee_Id;
● foreign key(外來鍵限制):foreign key是一個(/數個)指向其他表格中主鍵的欄位。外來鍵的目的是確定資料參考的完整性。
建置新表格時設定「外來鍵」的方式:
create table Employee
(EID integer not null unique primary key,
First_Name varchar(15) not null,
Last_Name varchar(15) not null,
Address varchar(30),
Age integer check(Age>0),
Birth_Date datetime,
Department_DID integer references Department (DID)
<或 Department_DID integer foreign key (Department_DID) references Department(DID) >
);
建置新表格時替「外來鍵命名與多欄位的組合鍵」的方式:
create table Employee
(EID integer not null,
Last_Name varchar(30) not null,
First_Name varchar(30) not null,
Address varchar(30),
constraint stu_Department_DID foreign key (Department_DID) references Department(DID));
改變現有表格架構來設定「外來鍵」的方式:
alter table Employee add foreign key (Department_DID) references Department (DID);
改變現有表格架構來「設定外來鍵限制欄位命名與多欄位」的方式:
alter table Employee add constraint stu_Department_DID foreign key (Department_DID) references Department(DID);
改變現有表格架構來「移除外來鍵」的方式:
alter table Employee drop constraint stu_Department_DID;
● default(預設限制):用來設定欄位的預設值,即當在insert資料時,若該欄位沒指定值的話,則會採用預設值之內容。
建置新表格時設定「預設值」的方式:
create table Employee
(EID integer not null primary key,
Last_Name varchar(30) not null,
First_Name varchar(30) not null,
Address varchar(30) default ‘未知’);
改變現有表格架構來「設定預設值」的方式:
alter table Employee add constraint df_Address default ‘未知’ for Address;
<或 alter table Employee alter column Address set default ‘未知’;>
改變現有表格架構來「移除預設值」的方式:
alter table Employee drop default Address;
<或 alter table Employee alter column Address drop default;>
● increment(唯一自動遞增資料值限制):其於每次新增資料時,欄位值都會「自動遞增資料值」,且該欄位值為唯一的。用途就像是一個識別碼或流水號,因此increment常與 Primary Key一起搭配使用。而SQL Server語法是使用「identity」這個關鍵字。
範例-建立員工資料表(Employee),並設定主鍵需有一識別碼:
create table Employee
(EID integer primary key identity,
First_Name varchar(15) notnull,
Last_Name varchar(15) notnull,
Address varchar(30));
※EID欄位不需要指定值,因SQL Server預設會由1開始逐列自動遞增(2,3,4...)。
※另外,也可以替identity欄位指定一個起始值與遞增量,語法如下:
將identity改成「identity (起始值,遞增量)」。
3. 參考資料
ü 建立與修改資料表
ü SQL 教學 » Constraint (限制) - SQL Tutorial
ü 賀瑞斯機器兵- T-SQL Add-Drop Default Value
留言列表