在本教學中,您將學習如何使用Oracle唯一約束來確保包含在一列或幾列中的資料在表中的行之間是唯一的。
一個唯一的約束是一個完整性約束,它確儲存儲在一列或一組列中的資料在表中的行之間是唯一的。
通常,在使用內聯約束語法建立表時,將唯一約束應用於列,如下所示:
CREATE TABLE table_name (
...
column_name data_type UNIQUE
...
);
此唯一約束指定column_name
中的值在整個表中是唯一的。也可以使用外線(out-of-line
)約束語法來定義一個唯一的約束:
CREATE TABLE table_name (
...,
UNIQUE(column_name)
);
可以通過使用CONSTRAINT
子句和約束名稱來指定一個唯一的約束名稱:
CREATE TABLE table_name (
...
column_name data_type CONSTRAINT unique_constraint_name UNIQUE
...
);
或者使用線外約束語法:
CREATE TABLE table_name (
...
column_name data_type,
...,
CONSTRAINT unique_constraint_name UNIQUE(column_name)
);
要為一組列定義一個唯一的約束,可以使用外線(out-of-line
)約束語法:
CREATE TABLE table_name (
...
column_name1 data_type,
column_name2 data_type,
...,
CONSTRAINT unique_constraint_name UNIQUE(column_name1, column_name2)
);
它指定兩列:column_name1
和column_name2
中的值的組合在整個表中是唯一的,但是這些列中的任何一個都可以不必是唯一的。
如果要為現有表新增唯一約束,請使用ALTER TABLE
語句:
ALTER TABLE table_name
ADD CONSTRAINT unique_constraint_name UNIQUE(column_name1, column_nam2);
有時,可能需要暫時禁用唯一的約束:
ALTER TABLE table_name
DISABLE CONSTRAINT unique_constraint_name;
如果要啟用它,參考語句:
ALTER TABLE table_name
ENABLE CONSTRAINT unique_constraint_name;
甚至刪除一個唯一的約束:
ALTER TABLE table_name
DROP CONSTRAINT unique_constraint_name;
下面為了演示,建立一個名為clients
的表:
CREATE TABLE clients (
client_id NUMBER GENERATED BY DEFAULT AS IDENTITY,
first_name VARCHAR2(50) NOT NULL,
last_name VARCHAR2(50) NOT NULL,
company_name VARCHAR2(255) NOT NULL,
email VARCHAR2(255) NOT NULL UNIQUE,
phone VARCHAR(25)
);
email
列有一個唯一的約束,確保不會有重複的電子郵件。
以下語句在clients
表中插入一行:
INSERT INTO clients(first_name,last_name, email, company_name, phone)
VALUES('Christene','Snider','[email protected]', 'ABC Inc', '408-875-6075');
現在,我們嘗試在email
列中插入一個電子郵件值已經存在的新行:
INSERT INTO clients(first_name,last_name, email, company_name, phone)
VALUES('Sherly','Snider','[email protected]', 'ABC Inc', '408-875-6076');
Oracle發出以下錯誤訊息,表示違反了唯一性約束:
SQL Error: ORA-00001: unique constraint (OT.SYS_C0010726) violated
如果要為兩列:company_name
和phone
新增唯一的約束,可以使用以下ALTER TABLE
語句:
ALTER TABLE clients
ADD CONSTRAINT unique_company_phone UNIQUE(company_name, phone);
結果,company_name
和phone
列中值的組合在clients
表中的行中是唯一的。
以下語句嘗試插入已經存在的公司和電話的新記錄到clients
表中:
INSERT INTO clients(first_name,last_name, email, company_name, phone)
VALUES('Sherly', 'Snider','[email protected]', 'ABC Inc', '408-875-6075');
Oracle發出以下錯誤資訊:
SQL Error: ORA-00001: unique constraint (OT.UNIQUE_COMPANY_PHONE) violated
但是,可以新增公司名已存在於clients
表中但具有不同電話的客戶:
INSERT INTO clients(first_name,last_name, email, company_name, phone)
VALUES('Sherly','Snider','[email protected]', 'ABC Inc', '408-875-6076');
以上語句應該可以正常執行。
要禁用唯一約束UNIQUE_COMPANY_PHONE
,請使用以下語句:
ALTER TABLE clients
DISABLE CONSTRAINT unique_company_phone;
要啟用唯一約束UNIQUE_COMPANY_PHONE
,請使用以下語句:
ALTER TABLE clients
ENABLE CONSTRAINT unique_company_phone;
要刪除唯一約束UNIQUE_COMPANY_PHONE
,請使用以下語句:
ALTER TABLE clients
DROP CONSTRAINT unique_company_phone;
在本教學中,您已經學習了如何使用Oracle唯一約束來確保表中的行之間包含在一列或一組列中的資料是唯一的。