我在Oracle中有一个表,其中包含以下Schema:
City_ID Name State Country BuildTime Time
当我宣布该表时,我的主键是City_ID
和BuildTime
,但现在我想将主键更改为三列:
City_ID BuildTime Time
如何更改主键?
答案 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);
确保没有time
为NULL
的记录,否则您将无法重新创建约束。
答案 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"