我正在使用 Oracle 数据库 23ai,免费版本,以及 Allround Automations 的 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
不应该有另一个限制。为了验证这一点,我按照这个问题中的建议尝试了以下操作
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_capital
的约束。紧接着,ORA-02264
再次弹出,再次表明该名称已被使用。我确保没有拼写错误 - 您看到的代码是复制粘贴的。有人可以告诉我哪里出错了吗?
提前感谢所有答案!
PS.:我发现另一篇文章建议我可以使用
找到约束名称SELECT owner, constraint_type, table_name
from user_constraints
where constraint_name = 'fk_capital';
但在我的例子中,结果表是空的。
Oracle 数据字典中的名称以大写形式显示。您应该查询
fk_capital
,而不是查询 FK_CAPITAL
。
SELECT owner, constraint_type, table_name
FROM user_constraints
WHERE constraint_name = 'FK_CAPITAL';