在本教學中,您將學習如何使用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_nr
和item_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
約束,如創建,添加,禁用,啟用和刪除表的主鍵。