Oracle主鍵


在本教學中,您將學習如何使用Oracle PRIMARY KEY約束來管理表的主鍵。

主鍵介紹

主鍵是表中列的唯一標識表中的行的一列或多列的組合。

以下是設定列成為主鍵的規則:

  • 主鍵列不能包含NULL值或空字串。
  • 主鍵值在整個表中必須是唯一的。
  • 主鍵值不應隨時間而改變。

根據這些規則,以下是對主鍵的建議:

  • 首先,主鍵應該是沒有意義的。 有時,您可能需要使用有意義的資料,例如:社會安全號碼(SSN),車輛識別號碼(VIN),電子郵件和電話號碼等,這些資料被認為是唯一的。 但是,您不知道電子郵件或電話號碼何時更改或被他人重複使用。 在這種情況下,會造成很多資料問題。
  • 其次,主鍵應該是緊湊的。 主鍵通常是數位的,因為Oracle通常處理數位的速度比任何其他資料型別更快。

注意:儘管在Oracle中不是強制性的,但在每個表中都有一個主鍵是最佳實踐。

要在表中建立主鍵,可以使用PRIMARY KEY約束。

Oracle PRIMARY KEY約束範例

通常,在建立表時建立表的主鍵。另外,通過使用ALTER TABLE語句,可以在建立表之後再新增一個主鍵。

1. 建立由一列組成的主鍵

以下CREATE TABLE語句建立purchase_orders表:

CREATE TABLE purchase_orders (
    po_nr NUMBER PRIMARY KEY,
    vendor_id NUMBER NOT NULL,
    po_status NUMBER(1,0) NOT NULL,
    created_at TIMESTAMP WITH TIME ZONE NOT NULL 
);

purchase_orders表具有建立採購訂單的四列採購訂單號(po_nr),供應商編號(vendor_id),採購訂單狀態(po_status)以及時間戳(created_at)。

在此表中,通過使用PRIMARY KEY子句將po_nr列定義為主鍵。

請注意,PRIMARY KEY子句隱式地將po_nrcolumn設定為NOT NULL,因此不必像以下那樣定義列:

po_nr NUMBER NOT NULL PRIMARY KEY

本範例中的PRIMARY KEY約束是內聯約束,因為它與po_nr列位於同一行。

考慮下面的語句 -

CREATE TABLE purchase_orders (
    po_nr NUMBER,
    vendor_id NUMBER NOT NULL,
    po_status NUMBER(1,0) NOT NULL,
    created_at TIMESTAMP WITH TIME ZONE NOT NULL,
    CONSTRAINT pk_purchase_orders PRIMARY KEY(po_nr)
);

這個例子使用PRIMARY KEY約束作為表約束。注意以下子句:

CONSTRAINT pk_purchase_orders PRIMARY KEY(po_nr)

另外,上面語句中明確地給PRIMARY KEY主鍵約束分配了一個名稱:pk_purchase_orders

2. 建立由多個列組成的主鍵

以下語句建立採購訂單專案表:

CREATE TABLE purchase_order_items (
    po_nr NUMBER NOT NULL,
    item_nr NUMBER NOT NULL,
    product_id NUMBER NOT NULL,  
    quantity NUMBER NOT NULL,
    purchase_unit NUMBER NOT NULL,
    buy_price NUMBER (9,2) NOT NULL,
    delivery_date DATE,
    PRIMARY KEY (po_nr, item_nr)
);

在此範例中,purchase_order_items表的主鍵由兩列組成:po_nritem_nr。 這意味著這些列的值的組合唯一地標識採購訂單行專案。

此範例沒有使用CONSTRAINT子句為PRIMARY KEY約束顯式分配一個名稱。 因此,Oracle隱式分配了主鍵約束,系統生成的名稱(如SYS_C0010617)。

2. 將主鍵新增到表中

有時,您可能需要將主鍵約束新增到一個存在的表。要做到這一點,只需要使用ALTER TABLE語句,如下所示:

ALTER TABLE table_name
ADD CONSTRAINT constraint_name 
PRIMARY KEY (column1, column2, ...);

以下範例首先建立vendors表,然後向其新增主鍵約束:

CREATE TABLE vendors (
    vendor_id NUMBER,
    vendor_name VARCHAR2(255) NOT NULL,
    address VARCHAR2(255) NOT NULL
);

ALTER TABLE vendors 
ADD CONSTRAINT pk_vendors PRIMARY KEY (vendor_id);

3. 刪除Oracle PRIMARY KEY約束

一般很少會從表中刪除PRIMARY KEY約束。 如果必須要刪除主鍵,則使用以下ALTER TABLE語句。

ALTER TABLE table_name
DROP CONSTRAINT primary_key_constraint_name;

例如,可以按照以下方式刪除vendors表的主鍵約束:

ALTER TABLE vendors
DROP CONSTRAINT pk_vendors;

可以使用以下語句刪除表的主鍵:

ALTER TABLE table_name
DROP PRIMARY KEY;

例如:

ALTER TABLE vendors
DROP PRIMARY KEY;

4. 啟用/禁用Oracle PRIMARY KEY約束

要在將大量資料載入到表中或更新海量資料時需要提高效能,可以暫時禁用PRIMARY KEY約束。

要禁用表的主鍵約束,可以使用ALTER TABLE語句:

ALTER TABLE table_name
DISABLE CONSTRAINT primary_key_constraint_name;

或者,

ALTER TABLE table_name
DISABLE PRIMARY KEY;

例如,要禁用purchase_orders表的主鍵約束,請使用以下語句:

ALTER TABLE purchase_orders
DISABLE CONSTRAINT pk_purchase_orders;

或者,

ALTER TABLE purchase_orders
DISABLE PRIMARY KEY;

要啟用主鍵約束,請使用以下ALTER TABLE語句:

ALTER TABLE table_name
ENABLE CONSTRAINT primary_key_constraint_name;

或者,

ALTER TABLE table_name
ENABLE PRIMARY KEY;

以下範例啟用了purchase_orders表的PRIMARY KEY約束:

ALTER TABLE purchase_orders
ENABLE CONSTRAINT pk_purchase_orders;

或者,

ALTER TABLE purchase_orders
ENABLE PRIMARY KEY;

在本教學中,您學習了如何使用Oracle PRIMARY KEY約束,如建立,新增,禁用,啟用和刪除表的主鍵。