我确信我必须做一些非常愚蠢的事情,因为在现有的表中添加新的外键很难。但是,我仍然坚持。这就是我正在做的事情。
首先,我在TPM_USER
中创建了一个新列,用于存储用户所在的团队:
ALTER TABLE TPM_USER ADD (
"TEAMID" NUMBER NULL
)
这没有错误,我可以查询TPM_USER
表以查看是否添加了新列。接下来,我希望TEAMID引用已存在的TPM_DEVELOPMENTTEAMS
表中的一行。所以我这样做:
ALTER TABLE TPM_USER
ADD CONSTRAINT TPM_USER_FK1
FOREIGN KEY(TEAMID)
REFERENCES TPM_DEVELOPMENTTEAMS(TEAMID)
这给了我错误:
ORA-02270:此列列表没有匹配的唯一键或主键
我已检查过两个TEAMID
列是相同的数据类型(NUMBER),TEAMID当然是DEVELOPMENTTEAMS
表的主键。实际上,这里是DEVELOPMENTTEAMS
:
CREATE TABLE TPMDBO.TPM_DEVELOPMENTTEAMS (
TEAMID NUMBER NULL,
NAME VARCHAR2(100) NOT NULL,
ISACTIVE CHAR(1) NULL,
SORTORDER NUMBER NULL,
SHORTNAME VARCHAR2(100) NULL,
GROUPID NUMBER NOT NULL,
CONSTRAINT TPM_DEVELOPMENTTEAMS_PK PRIMARY KEY(TEAMID)
NOT DEFERRABLE
DISABLE NOVALIDATE
)
我甚至尝试在Aqua Data Studio中使用GUI界面添加新约束,所以我确定我没有拼错任何东西。我做错了什么?
答案 0 :(得分:4)
您的PK已停用。启用它:
ALTER TABLE TPM_DEVELOPMENTTEAMS ENABLE CONSTRAINT TPM_DEVELOPMENTTEAMS_PK;
顺便说一句,通过声明PK,你还使TPM_DEVELOPMENTTEAMS.TEAMID
非NULL(因此在它之后没有任何目的)。
答案 1 :(得分:0)
您只能引用相同/其他表的已启用主键或唯一键的列(或列组合)。
如果您在以下查询中发现禁用了约束,则无法为该PK / UK创建外键。你应该启用它。
select constraint_name from dba_constraints
where constraint_type in ('P','U')
and status = 'DISABLED'
and lower(table_name) = lower(:p_table_name);