Oracle - 无法在现有表上创建新的FK

时间:2012-05-14 16:50:30

标签: sql oracle foreign-keys oracle11g

我确信我必须做一些非常愚蠢的事情,因为在现有的表中添加新的外键很难。但是,我仍然坚持。这就是我正在做的事情。

首先,我在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界面添加新约束,所以我确定我没有拼错任何东西。我做错了什么?

2 个答案:

答案 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);