Oracle SQL 主键卡住
Posted
技术标签:
【中文标题】Oracle SQL 主键卡住【英文标题】:Oracle SQL primary key stuck 【发布时间】:2017-08-08 11:31:17 【问题描述】:我遇到了一个奇怪的问题。我正在创建当前现有表的副本并向它们添加分区。
流程如下:
重命名当前约束(不能在不删除表本身的情况下删除它们,因为我稍后需要数据)
创建一个在结构上复制当前分区表的新分区表。
所以我有MYTABLE
(原始)和PART_TABLE
(新分区),包括FKs
使用INSERT INTO SELECT
子句复制数据
使用索引和 PK 更改表
重命名表,最后得到MYTABLE
(新分区)和TRASH_TABLE
(原始)
不幸的是,在第 4 步中,我遇到了错误
ALTER TABLE MYTABLE ADD CONSTRAINT "PK_MYTABLE"
PRIMARY KEY ("MY_ID", "SEQUENCE")
USING INDEX LOCAL TABLESPACE INDEXSPACE;
SQL 错误:ORA-00955:“名称已被现有对象使用”
现在,我从逻辑上假设我只是忘记重命名 PK,所以我检查了TRASH_TABLE
,但我看到正确重命名的 PK。
我也跑了
SELECT *
FROM ALL_CONSTRAINTS
WHERE CONSTRAINT_NAME LIKE 'PK_MYTABLE'
它返回了 0 个结果。与表USER_CONSTRAINTS
相同。
重命名的 PK 显示正确。
我注意到的另一件事是,只有 PK 以这种方式锁定。添加 FK 或 UNIQUE 约束就可以了。
【问题讨论】:
也许你不能这样做,但从头开始创建新表可能更容易。 我正在通过CREATE TABLE
语句从头开始创建 PART_ 表。我不能事先删除原始表,因为我需要里面包含的数据。我只需要解除它们的约束。
分区表可能还在。如果我是正确的,分区和分区都有些相关(只是分区表是为了更好的数据库性能而组织的)......删除父表中的约束,看看问题是否仍然存在......
尝试查询all_objects
而不是约束,也许你有另一个同名的对象(没有约束)。
How to rename a primary key in Oracle such that it can be reused的可能重复
【参考方案1】:
如How to rename a primary key in Oracle such that it can be reused 中所述,问题在于Oracle 为主键创建了索引。您还需要重命名自动生成的索引。作为suggested by Tony Andrews,试试
ALTER INDEX "PK_MYTABLE" RENAME TO "PK_MYTABLE_OLD";
【讨论】:
以上是关于Oracle SQL 主键卡住的主要内容,如果未能解决你的问题,请参考以下文章
binlog_format=ROW模式下mysql表无主键造成的从库延迟(卡住)