# [Oracle]主鍵、外鍵 ###### tags: `oracle` `primary key` `foreign key` `database` `SQL` `Oracle SQL Developer` > [time= 2019 11 18 ] > 原文 & 參考: > https://www.1keydata.com/tw/sql/sql-foreign-key.html > https://www.twblogs.net/a/5b7efb112b717767c6ad05f7 `SQL Developer version: 19.1.0.094.2042` <br> ## 主鍵: ```sql= "ID" NUMBER(10, 0) NOT NULL ENABLE PRIMARY KEY, ``` 或 ```sql= CONSTRAINT PK_TABLE_ID PRIMARY KEY(TYPE_ID) ``` <br><br><br> ## 複合主鍵 ```sql= CONSTRAINT PK_TABLE_TOPIC_SUBTOPIC_ID PRIMARY KEY(TOPIC, SUBTOPIC_ID) ``` <br><br><br> ## 在創建 table 後,使用ALTER TABLE語法 ```sql= -- 單主鍵 ALTER TABLE YOUR_TABLE ADD CONSTRAINT PK_TABLE_ID PRIMARY KEY (ID); -- 複合主鍵 ALTER TABLE YOUR_TABLE ADD CONSTRAINT PK_TABLE_TOPIC_SUBTOPIC_ID PRIMARY KEY (TOPIC, SUBTOPIC_ID); ``` <br><br><br> ## 外鍵: ```sql= "MAIL_ADDRESS_ID" NUMBER(10, 0) REFERENCES YOUR_FK_TABLE(MAIL_ADDRESS_ID), ``` 或 ```sql= CONSTRAINT FK_TABLE_MAIL_ADDRESS_ID FOREIGN KEY(MAIL_ADDRESS_ID) REFERENCES YOUR_FK_TABLE(MAIL_ADDRESS_ID) ``` <br><br><br> ## 複合外鍵: ```sql= CONSTRAINT FK_TABLE_TOPIC_MAIL_ADDRESS_ID FOREIGN KEY(TOPIC, SUBTOPIC_ID) REFERENCES YOUR_FK_TABLE(TOPIC, SUBTOPIC_ID) ``` <br><br><br> ## 在創建 table 後,使用ALTER TABLE語法 ```sql= -- 單外鍵 ALTER TABLE YOUR_TABLE ADD (CONSTRAINT FK_TABLE_MAIL_ADDRESS_ID) FOREIGN KEY (MAIL_ADDRESS_ID) REFERENCES YOUR_FK_TABLE (MAIL_ADDRESS_ID); -- 複合外鍵 ALTER TABLE YOUR_TABLE ADD (CONSTRAINT FK_TABLE_MAIL_ADDRESS_ID) FOREIGN KEY (TOPIC, SUBTOPIC_ID) REFERENCES YOUR_FK_TABLE (TOPIC, SUBTOPIC_ID); ``` <br><br><br> ## 完整範例 ### TABLE_A ```sql= CREATE TABLE "WMS"."TABLE_A" ( "ID" NUMBER(10, 0) NOT NULL ENABLE PRIMARY KEY, "TOPIC" VARCHAR2(30 BYTE) NOT NULL ENABLE, "SUBTOPIC_ID" NUMBER(10, 0) NOT NULL ENABLE, "MAIL_ADDRESS_ID" NUMBER(10, 0) , "UPD_DATE" DATE, "CRT_DATE" DATE DEFAULT(SYSDATE) NOT NULL ENABLE , "CRT_NAME" NVARCHAR2(16) NOT NULL ENABLE, CONSTRAINT FK_TABLE_A_TOPIC__SUBTOPIC_ID FOREIGN KEY(TOPIC, SUBTOPIC_ID) REFERENCES TABLE_B(TOPIC, SUBTOPIC_ID), -- 複合外鍵 CONSTRAINT FK_TABLE_B_MAIL_ADDRESS_ID FOREIGN KEY(MAIL_ADDRESS_ID) REFERENCES TABLE_C(MAIL_ADDRESS_ID) --外鍵 ); ``` <br><br><br> ### TABLE_B ```sql= CREATE TABLE "WMS"."TABLE_B" ( "TOPIC" VARCHAR2(30 BYTE) NOT NULL ENABLE , "SUBTOPIC_ID" NUMBER(10, 0) NOT NULL ENABLE , "SUBTOPIC" VARCHAR2(100 BYTE) NOT NULL ENABLE, "MAILTYPE" VARCHAR2(30 BYTE) NOT NULL ENABLE, "MAIL_SUBJECT" VARCHAR2(200 BYTE), "MAIL_BODY" VARCHAR2(500 BYTE), "MAIL_ATTACHMENT" VARCHAR2(500 BYTE), CONSTRAINT PK_TABLE_B_TOPIC_SUBTOPIC_ID PRIMARY KEY(TOPIC, SUBTOPIC_ID) --複合主鍵 ); ``` <br><br><br> ### TABLE_C ```sql= CREATE TABLE "WMS"."TABLE_C" ( "MAIL_ADDRESS_ID" NUMBER(10, 0) NOT NULL ENABLE PRIMARY KEY, "MAIL_ADDRESS" VARCHAR2(100 BYTE) NOT NULL ENABLE, "DC_CODE" VARCHAR2(20 BYTE), "GUP_CODE" VARCHAR2(20 BYTE), "CUST_CODE" VARCHAR2(20 BYTE), "ENABLE" NUMBER(1) DEFAULT(1) NOT NULL CHECK(ENABLE in (0, 1)) ); ```