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表无主键造成的从库延迟(卡住)

oracle执行update语句卡住不动

pl/sql编译存储过程卡住的解决方法

当我试图让两个主键处于休眠状态时,我被卡住了

pl/sqldeveloper工具的sql窗口查询完毕点下拉(获取最后页)时候卡住,要很久才执行完,求解决办法。

多次卡住调用oracle程序