Oracle唯一約束


在本教學中,您將學習如何使用Oracle唯一約束來確保包含在一列或幾列中的資料在表中的行之間是唯一的。

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_name1column_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;

Oracle唯一約束例子

下面為了演示,建立一個名為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_namephone新增唯一的約束,可以使用以下ALTER TABLE語句:

ALTER TABLE clients
ADD CONSTRAINT unique_company_phone UNIQUE(company_name, phone);

結果,company_namephone列中值的組合在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唯一約束來確保表中的行之間包含在一列或一組列中的資料是唯一的。