代码之家  ›  专栏  ›  技术社区  ›  new_newbie

Oracle数据库23ai:发生错误ORA-02264,但我既找不到具有指定名称的约束,也没有删除约束

  •  0
  • new_newbie  · 技术社区  · 10 月前

    我使用的是Oracle数据库23ai,免费版,以及Allround Automation的PL/SQL开发工具。我得到了错误 ORA-02264 虽然我理解它的含义(发现了一个已经处于活动状态的同名约束,其中禁止为两个约束分配相同的名称),但我不明白为什么在我的情况下会出现这个错误。

    我正在尝试以下代码:

    CREATE TABLE nations (
    nations_id INTEGER GENERATED BY DEFAULT AS IDENTITY,
    name NVARCHAR2(255) NOT NULL,
    continent NVARCHAR2(20) NOT NULL,
    habitants_at_2024 INTEGER,
    capital NVARCHAR2(255) NOT NULL,
    CONSTRAINT pk_nations PRIMARY KEY(nations_id),
    CONSTRAINT unique_nation_name UNIQUE(name)
    );
    -- cities
    CREATE TABLE cities(
    cities_id INTEGER GENERATED BY DEFAULT AS IDENTITY,
    name NVARCHAR2(255) NOT NULL,
    country NVARCHAR2(255),
    CONSTRAINT pk_cities PRIMARY KEY(cities_id),
    CONSTRAINT unique_city_name UNIQUE(name),
    CONSTRAINT fk_country FOREIGN KEY(country) REFERENCES nations(name)
    );
    ALTER TABLE nations ADD CONSTRAINT fk_capital FOREIGN KEY(capital) REFERENCES cities(name);
    

    错误消息:

    ORA-02264:名称已被现有约束使用

    在线上弹出 ALTER TABLE 声明。

    然而,我很确定这个名字不应该有另一个限制 fk_capital 。为了验证这一点,我按照中的建议尝试了以下操作 this question

    SELECT *
      FROM all_constraints
     WHERE table_name = UPPER('table_name'); 
    

    该命令运行良好,但我在生成的表中也找不到约束名称。更重要的是,我尝试了以下方法:

    ALTER TABLE nations DROP CONSTRAINT fk_capital;
    ALTER TABLE nations ADD CONSTRAINT fk_capital FOREIGN KEY(capital) REFERENCES cities(name);
    

    尝试删除约束失败,并显示错误消息 ORA-02443 ,这表明名称没有约束 fk资本 在那之后, ORA-02264 再次弹出,表示该名称已被使用。我确保没有拼写错误——你看到的代码是复制粘贴的。有人能告诉我哪里出了问题吗?

    提前感谢所有的回答!

    PS:我找到了 another post 建议我可以使用以下命令找到约束名称

    SELECT owner, constraint_type, table_name
    from user_constraints
    where constraint_name = 'fk_capital';
    

    但在我的例子中,结果表是空的。

    2 回复  |  直到 10 月前
        1
  •  0
  •   Mureinik    10 月前

    Oracle数据字典中的名称以大写字母显示。而不是查询 fk_capital ,您应该查询 FK_CAPITAL .

    SELECT owner, constraint_type, table_name
    FROM   user_constraints
    WHERE  constraint_name = 'FK_CAPITAL';
    
        2
  •  0
  •   Rahul Thakur    10 月前

    当您执行查询以检查约束fk_capital时,它可能不会返回结果,因为Oracle在内部将其视为fk_capital。

    解决问题的步骤:

    1. 验证约束名称:运行以下查询以检查大写约束:

    选择所有者、约束类型、表名 来自用户约束 其中constraint_name='FK_CAPITAL';

    1. 检查表的所有约束:如果上述查询不起作用,请列出国家表的所有限制以确认其存在:

    选择constraint_name、constraint_type 来自用户约束 其中table_name=大写('NATIONS');

    1. 删除约束(如有必要):如果fk_capital约束存在,您可以使用以下命令删除它:

    ALTER TABLE国家减少约束fk_capital;

    1. 重新创建约束:一旦确认或删除,您就可以重新创建约束了:

    ALTER TABLE国家 添加约束fk_capital外键(大写)参考城市(名称);

    其他提示:

    确保没有重复的约束:确认没有其他约束在不同的模式中使用fk_capital名称。

    选择所有者、表名、约束名 来自所有约束 其中constraint_name='FK_CAPITAL';

    模式所有权:如果您在多模式环境中工作,请确保在表名前加上模式名(例如Schema_name.names),以查询正确的模式。

    如果问题仍然存在,则可能与Oracle免费版本限制或数据库错误有关。