【问题标题】:Cannot create foreign key on oracle无法在 oracle 上创建外键
【发布时间】:2023-04-08 11:28:02
【问题描述】:

我正在尝试为名为 Words_in_group 的表创建外键,该表包含用户创建的 froup 中的所有单词。

我正在尝试将单词引用到一个名为:Words 的表,它的 P 键是“Word”。

也许这与使用复合键的“Words”表有关?

这是创建外键的脚本。

alter table "WORDS_IN_GROUP" add constraint
"WORDS_IN_GROUP_FK1" foreign key ("WORD") references "WORDS" ("WORD")
/   

这里是表格 SQL:

CREATE TABLE  "WORDS_IN_GROUP"  (   "GROUP_CODE" NUMBER(9,0) NOT NULL ENABLE, 
"WORD" VARCHAR2(45) NOT NULL ENABLE, 
 CONSTRAINT "WORDS_IN_GROUP_PK" PRIMARY KEY ("GROUP_CODE") ENABLE  ) ;ALTER TABLE  "WORDS_IN_GROUP" ADD CONSTRAINT "WORDS_IN_GROUP_FK" FOREIGN KEY ("GROUP_CODE")
  REFERENCES  "GROUP_OF_WORDS" ("GROUP_CODE") ON DELETE CASCADE ENABLE;CREATE OR REPLACE TRIGGER  "BI_WORDS_IN_GROUP"  before insert on "WORDS_IN_GROUP"                for each row  begin    if :NEW."GROUP_CODE" is null then 
select "GROUP_OF_WORDS_SEQ".nextval into :NEW."GROUP_CODE" from dual; end if; end; /ALTER TRIGGER  "BI_WORDS_IN_GROUP" ENABLE;
***///////////

CREATE TABLE  "WORDS"  (    "WORD" VARCHAR2(45) NOT NULL ENABLE, 
"FILE_SN" NUMBER(9,0) NOT NULL ENABLE, 
"FILE_NAME" VARCHAR2(16) NOT NULL ENABLE, 
"POSITION_NUM" NUMBER(5,0) NOT NULL ENABLE, 
"SECTION_NUM" NUMBER(5,0) NOT NULL ENABLE, 
"WORD_SECTION_POSITION" NUMBER(4,0) NOT NULL ENABLE, 
 CONSTRAINT "WORDS_PK" PRIMARY KEY ("WORD", "FILE_SN") ENABLE ) ;

这是我得到的错误:

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

【问题讨论】:

  • 这是因为 Words 表中的主键由 2 列组成:word+file_sn,而您的外键是单列:word
  • 欢迎来到 Stack Overflow。请始终将源代码、错误消息和其他文本信息作为内联纯文本而不是外部图片提供。文本是可搜索的、可重复使用的并且通常更易于阅读。我已经为你编辑了问题。

标签: sql oracle foreign-keys ddl


【解决方案1】:

外键必须始终指向唯一键(明确定义或定义为主键)。正如您所指出的,words 中的 word 不一定是唯一的 - 只有 word, file_sn 的组合才是。您可以使 word 本身独一无二,也可以在 word_in_group 表中添加一个 flie_sn 列并拥有一个复合外键,以更适合您的应用程序逻辑为准。

【讨论】:

  • 嗨@Mureinik,假设我将wordwords_in_group 表中设为唯一,我仍然可以使用不同的Group_code 保持相同的word 吗?我想这会给我带来麻烦。
【解决方案2】:

您为表 WORDS 创建了复合主键。但是您只引用表 WORDS_IN_GROUP 中的单个列。这是不允许的。

您只能引用那些唯一的列/列组(启用主键/唯一键)。如果它是复合的,那么您可以创建复合 FK。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-26
    • 2020-04-27
    • 2013-10-05
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多