1

我确信我一定是在做一些非常愚蠢的事情,因为向现有表添加新的外键并不难。但是,我仍然卡住了。这就是我正在做的事情。

首先,我创建了一个新列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 界面来添加新的约束,所以我确信我没有拼错任何东西。我究竟做错了什么?

4

2 回答 2

4

您的 PK 已禁用。启用它:

ALTER TABLE TPM_DEVELOPMENTTEAMS ENABLE CONSTRAINT TPM_DEVELOPMENTTEAMS_PK;

顺便说一句,通过将其声明为 PK,您还使TPM_DEVELOPMENTTEAMS.TEAMID非 NULL (因此在它之后没有 NULL 的目的)。

于 2012-05-14T17:12:49.253 回答
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);
于 2017-11-10T09:25:50.210 回答