AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 5332
Accepted
Álvaro González
Álvaro González
Asked: 2011-09-02 23:29:33 +0800 CST2011-09-02 23:29:33 +0800 CST 2011-09-02 23:29:33 +0800 CST

不能删除不存在的约束,也不能创建它

  • 772

在使用生产数据副本测试一些迁移脚本(脚本在开发数据中运行良好)时,我发现了一个奇怪的情况。约束已更改,因此我发出 DROP + ADD 命令:

ALTER TABLE A_DUP_CALLE
DROP CONSTRAINT A_DUP_CALLE_UK1;

ALTER TABLE A_DUP_CALLE
ADD CONSTRAINT A_DUP_CALLE_UK1 UNIQUE (
    CONTROL_ID,
    CALLE_AYTO_DUPL
)
ENABLE;

DROP 命令运行良好,但 ADD 命令失败。现在,我陷入了一个恶性循环。我无法删除约束,因为它不存在(初始删除按预期工作):

ORA-02443: 无法删除约束 - 不存在的约束

而且我无法创建它,因为名称已经存在:

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

我A_DUP_CALLE_UK1在 SQL Developer 的搜索框中输入内容,然后……就在那里!所有者、表名、表景......一切都匹配:它不是同名的不同对象,它是我原来的约束。该表出现在约束详细信息中,但约束未出现在表的详细信息中。

我的问题:

  • 对此有何解释?
  • 当我在实时服务器中进行真正的升级时,如何确保不会发生这种情况?

(服务器是 10g XE,我没有足够的声望来创建标签。)

oracle oracle-10g
  • 5 5 个回答
  • 46549 Views

5 个回答

  • Voted
  1. Best Answer
    Jack Douglas
    2011-09-03T00:43:37+08:002011-09-03T00:43:37+08:00

    猜测我会说玛丽安是对的,这是由具有相同名称的唯一索引和约束引起的,例如:

    create table t( k1 integer, k2 integer, 
                    constraint u1 unique(k1,k2) using index(create unique index u1 on t(k1,k2)),
                    constraint u2 unique(k2,k1) using index u1);
    
    select count(*) from user_indexes where index_name='U1';
    
    COUNT(*)               
    ---------------------- 
    1  
    
    alter table t drop constraint u1;
    
    select count(*) from user_indexes where index_name='U1';
    
    COUNT(*)               
    ---------------------- 
    1  
    

    通常,当您添加唯一约束时,会创建一个具有相同名称的唯一索引 - 但索引和约束不是一回事。看看all_indexes是否有一个索引被调用A_DUP_CALLE_UK1,并在你删除它之前尝试弄清楚它是否被其他东西使用!

    • 14
  2. a_horse_with_no_name
    2011-09-02T23:44:36+08:002011-09-02T23:44:36+08:00

    看起来很奇怪。

    你可以运行:

     SELECT *
     FROM user_objects
     WHERE object_name = 'A_DUP_CALLE_UK1'
    

    检查甲骨文是否抱怨什么样的对象。然后您可以为此运行适当的 DROP 语句。

    我能想到的唯一另一件事是完全删除表,DROP TABLE A_DUP_CALLE CASCADE CONSTRAINTS以摆脱属于该表的所有内容,然后完全重新创建它。

    如果表包含有价值的数据,您可以在之前对其进行备份:

    CREATE TABLE old_data
    AS
    SELECT *
    FROM A_DUP_CALLE;
    

    重新创建表后,您可以执行

    INSERT INTO A_DUP_CALLE (col1, col2, col3) 
    SELECT col1, col2, col3
    FROM old_data
    

    来恢复数据。

    • 6
  3. Cristian Meneses A
    2011-09-29T08:30:15+08:002011-09-29T08:30:15+08:00

    几分钟前我遇到了同样的问题......我找到了解释。

    通过创建主键,Oracle 创建了两个对象:一个约束和一个控制“唯一”部分的索引。

    通过删除约束,索引保留在那里,使用相同的索引名称,所以如果你只执行

    alter table t drop constraint u1;
    

    您将只删除约束。要删除索引,您需要执行

    drop index u1;
    

    这应该做的工作。或者,您可以使用命令同时执行这两个命令

    alter table t drop constraint u1 including indexes;
    
    • 6
  4. gavenkoa
    2014-09-06T06:39:30+08:002014-09-06T06:39:30+08:00

    主键约束带有索引。您删除约束但不删除索引。查看:

    select * from ALL_OBJECTS where OBJECT_NAME = 'PK_TBL_CONSTR';
    

    你看到OBJECT_TYPE的是INDEX。

    两者都这样做:

    alter table TBL drop constraint PK_TBL_CONSTR;
    drop index PK_TBL_CONSTR;
    
    • 1
  5. Sachin
    2014-12-25T02:33:33+08:002014-12-25T02:33:33+08:00

    做这个

    ALTER TABLE A_DUP_CALLE
    DROP CONSTRAINT "A_DUP_CALLE_UK1";
    

    它会起作用的。

    图片: 在此处输入图像描述

    • 1

相关问题

  • Oracle 中的数据库备份 - 导出数据库还是使用其他工具?

  • ORDER BY 使用文本列的自定义优先级

  • 舒服的sqlplus界面?[关闭]

  • 如何在数据库中找到最新的 SQL 语句?

  • 如何使用正则表达式查询名称?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    您如何显示在 Oracle 数据库上执行的 SQL?

    • 2 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    我可以查看在 SQL Server 数据库上运行的历史查询吗?

    • 6 个回答
  • Marko Smith

    如何在 PostgreSQL 中使用 currval() 来获取最后插入的 id?

    • 10 个回答
  • Marko Smith

    如何在 Mac OS X 上运行 psql?

    • 11 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Marko Smith

    将数组参数传递给存储过程

    • 12 个回答
  • Martin Hope
    Manuel Leduc PostgreSQL 多列唯一约束和 NULL 值 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler 什么时候应该将主键声明为非聚集的? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - 哪个更好作为主键? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick 如何优化大型数据库的 mysqldump? 2011-01-04 13:13:48 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve