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

Sql Oracle-无法在现有表上创建新FK,sql,oracle,foreign-keys,oracle11g,Sql,Oracle,Foreign Keys,Oracle11g,我确信我一定在做一些非常愚蠢的事情,因为向现有表添加一个新的外键不会这么难。然而,我还是被卡住了。这是我正在做的 首先,我在TPM\u USER中创建了一个新列来存储用户所在的团队: ALTER TABLE TPM_USER ADD ( "TEAMID" NUMBER NULL ) 这可以正常工作,并且我可以查询TPM\u用户表以查看已添加的新列。接下来,我希望TEAMID引用已经存在的TPM\U DEVELOPMENTTEAMS表中的一行。因此,我: ALTER TABLE TPM_US

我确信我一定在做一些非常愚蠢的事情,因为向现有表添加一个新的外键不会这么难。然而,我还是被卡住了。这是我正在做的

首先,我在
TPM\u USER
中创建了一个新列来存储用户所在的团队:

ALTER TABLE TPM_USER ADD (
  "TEAMID" NUMBER NULL
)
这可以正常工作,并且我可以查询
TPM\u用户
表以查看已添加的新列。接下来,我希望TEAMID引用已经存在的
TPM\U DEVELOPMENTTEAMS
表中的一行。因此,我:

ALTER TABLE TPM_USER
    ADD CONSTRAINT TPM_USER_FK1
    FOREIGN KEY(TEAMID)
    REFERENCES TPM_DEVELOPMENTTEAMS(TEAMID)
这给了我一个错误:

ORA-02270:此列列表没有匹配的唯一键或主键

我已经检查了两个
TEAMID
列都是相同的数据类型(编号),TEAMID当然是
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界面来添加新的约束,因此我确信我没有拼写错误。我做错了什么?

您的PK被禁用。通过以下方式启用它:

ALTER TABLE TPM_DEVELOPMENTTEAMS ENABLE CONSTRAINT TPM_DEVELOPMENTTEAMS_PK;

顺便说一句,通过声明PK,您还使
TPM\u DEVELOPMENTTEAMS.TEAMID
非NULL(因此在它之后没有NULL的用途)。

您的PK被禁用。通过以下方式启用它:

ALTER TABLE TPM_DEVELOPMENTTEAMS ENABLE CONSTRAINT TPM_DEVELOPMENTTEAMS_PK;

顺便说一句,通过声明它PK,您还使
TPM\u DEVELOPMENTTEAMS.TEAMID
非空(因此在它之后没有空值的用途)。

您只能引用相同/其他表的启用主键或唯一键的列(或列的组合)

如果您在下面的查询中发现您的约束被禁用,则无法为该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);

您只能引用同一/其他表的启用主键或唯一键的列(或列的组合)

如果您在下面的查询中发现您的约束被禁用,则无法为该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);

我想这是因为TPM_DEVELOPMENTTEAMS表上的主键设置为
DISABLE
。试着启用它。@a_horse_,没有名字-Picard/Riker风格的双面掌,谢谢!太糟糕了,错误消息不是“您的外键约束引用了当前已禁用的主键。”(不,禁用主键的不是我,这个数据库是由喝醉的蜘蛛猴设计的)像@a_horse_with_no_name说你可以用Enable a Primary Key检查启用主键的语法是:ALTER TABLE TABLE_name Enable CONSTRAINT_name;例如:ALTER TABLE SUPPORY enable CONSTRAINT SUPPORY_pk;我想这是因为TPM_DEVELOPMENTTEAMS表上的主键设置为
DISABLE
。试着启用它。@a_horse_,没有名字-Picard/Riker风格的双面掌,谢谢!太糟糕了,错误消息不是“您的外键约束引用了当前已禁用的主键。”(不,禁用主键的不是我,这个数据库是由喝醉的蜘蛛猴设计的)像@a_horse_with_no_name说你可以用Enable a Primary Key检查启用主键的语法是:ALTER TABLE TABLE_name Enable CONSTRAINT_name;例如:ALTER TABLE SUPPORY enable CONSTRAINT SUPPORY_pk;