2010-02-22 88 views
33

我有一個表中的Oracle其中有以下模式:更改主鍵

City_ID Name State Country BuildTime Time 

當我宣佈表我的主鍵既City_IDBuildTime,但現在我想改變主鍵的三列:

City_ID BuildTime Time 

如何更改主鍵?

回答

57

假設你的表名是city和您現有的主鍵是pk_city,你應該能夠做到以下幾點:

ALTER TABLE city 
DROP CONSTRAINT pk_city; 

ALTER TABLE city 
ADD CONSTRAINT pk_city PRIMARY KEY (city_id, buildtime, time); 

確保沒有記錄,其中timeNULL,否則你贏了無法重新創建約束條件。

33

你將需要刪除並重新創建這樣的主鍵:

alter table my_table drop constraint my_pk; 
alter table my_table add constraint my_pk primary key (city_id, buildtime, time); 

但是,如果有與引用該主鍵的外鍵與其它表,則需要先刪除這些,執行上述操作,然後使用新列列表重新創建外鍵。

一個可選的語法來刪除現有主鍵(例如,如果你不知道的約束名):

alter table my_table drop primary key; 
+0

我的主鍵是city_id和構建時的組合 所以我應該在的地方寫my_pk – 2010-02-22 11:57:24

+0

我正在使用「my_pk」作爲主鍵約束的名稱。你應該知道約束的名字是什麼,但是如果你不知道,你可以使用「alter table my_table drop primary key」。代替。 – 2010-02-22 12:05:18

+8

如果使用CASCADE子句將其刪除,則不需要刪除引用my_table.my_pk的相關外鍵。另外,只要刪除約束可能會使你周圍的索引可能或不需要;使用KEEP | DROP INDEX子句適當。 奇怪的是,所有這些都記錄在Oracle數據庫SQL參考中。 http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_3001.htm#i2103845 – 2010-02-22 14:38:36