2010-02-22 95 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