更改主键

时间:2010-02-22 11:34:47

标签: sql oracle primary-key

我在Oracle中有一个表,其中包含以下Schema:

City_ID  Name  State  Country  BuildTime  Time

当我宣布该表时,我的主键是City_IDBuildTime,但现在我想将主键更改为三列:

City_ID  BuildTime  Time

如何更改主键?

3 个答案:

答案 0 :(得分:66)

假设您的表格名称为city且您现有的主要密钥为pk_city,您应该可以执行以下操作:

ALTER TABLE city
DROP CONSTRAINT pk_city;

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

确保没有timeNULL的记录,否则您将无法重新创建约束。

答案 1 :(得分:37)

您需要删除并重新创建主键,如下所示:

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;

答案 2 :(得分:3)

有时我们执行以下步骤:

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

最后一条语句失败

ORA-00955“现有对象已使用该名称”

Oracle通常创建一个具有相同名称my_pk的唯一索引。在这种情况下,您可以删除唯一索引或根据约束是否仍然相关来对其重命名。

您可以将删除主键约束和唯一索引结合到单个sql语句中:

alter table my_table drop constraint my_pk drop index; 

检查以下内容: ORA-00955 "name is already used by an existing object"