更改主键

Moh*_*sal 42 sql oracle primary-key

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

City_ID  Name  State  Country  BuildTime  Time
Run Code Online (Sandbox Code Playgroud)

当我声明表时,我的主键是两个City_ID并且BuildTime现在我想将主键更改为三列:

City_ID  BuildTime  Time
Run Code Online (Sandbox Code Playgroud)

如何更改主键?

Pet*_*ang 69

假设您的表名是city和您现有的主键pk_city,您应该能够执行以下操作:

ALTER TABLE city
DROP CONSTRAINT pk_city;

ALTER TABLE city
ADD CONSTRAINT pk_city PRIMARY KEY (city_id, buildtime, time);
Run Code Online (Sandbox Code Playgroud)

确保没有记录其中timeNULL,否则你将无法重新创建该约束.


Ton*_*ews 38

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

alter table my_table drop constraint my_pk;
alter table my_table add constraint my_pk primary key (city_id, buildtime, time);
Run Code Online (Sandbox Code Playgroud)

但是,如果有其他表具有引用此主键的外键,则需要先删除它们,执行上述操作,然后使用新列列表重新创建外键.

删除现有主键的替代语法(例如,如果您不知道约束名称):

alter table my_table drop primary key;
Run Code Online (Sandbox Code Playgroud)

  • 如果使用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 (8认同)

Nar*_*mha 7

有时,当我们执行这些步骤时:

 alter table my_table drop constraint my_pk; 
 alter table my_table add constraint my_pk primary key (city_id, buildtime, time);
Run Code Online (Sandbox Code Playgroud)

最后一条语句失败

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

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

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

alter table my_table drop constraint my_pk drop index; 
Run Code Online (Sandbox Code Playgroud)

检查这个: ORA-00955“名称已被现有对象使用”