首页 文章

Oracle复合主键/外键问题

提问于
浏览
12

我在oracle的1个表中有一个复合主键 . 我想为我的第二个表中的一个表项创建一个外键,该表引用第一个表中的复合主键 . 我收到错误ORA-02256 . 关于如何进入这个的任何想法?

CREATE TABLE groupspersonx ( 
  personid number, 
  groupid number, 
  CONSTRAINT pk_persongroupid PRIMARY KEY(personid, groupid) 
); 

CREATE TABLE restrictedgroups ( 
  groupid number, 
  name varchar2(50), 
  dateadded date, 
  since date, 
  notes varchar2(1024), 
  CONSTRAINT pk_groupid PRIMARY KEY(groupid), 
  CONSTRAINT fk_persongroup FOREIGN KEY(groupid) REFERENCES groupspersonx(personid, groupid) 
);

4 回答

  • 19

    该错误是因为FOREIGN KEY是一列,但是're trying to supply two columns as the parent. There'不需要绑定到复合键,因为 restrictedgroups 没有 personid 列...

    你也有向后关系 - 使用:

    CREATE TABLE restrictedgroups ( 
      groupid number, 
      name varchar2(50), 
      dateadded date, 
      since date, 
      notes varchar2(1024), 
      CONSTRAINT pk_groupid PRIMARY KEY(groupid)
    );
    
    CREATE TABLE groupspersonx ( 
      personid number, 
      groupid number, 
      CONSTRAINT pk_persongroupid PRIMARY KEY(personid, groupid),
      CONSTRAINT fk_persongroup FOREIGN KEY(groupid) REFERENCES restrictedgroups(groupid) 
    );
    

    我会为 personid 来自的任何表添加外键约束 .

  • 0
    CREATE TABLE groupspersonx( 
      personid number, groupid number, 
    CONSTRAINT pk_persongroupid PRIMARY KEY(personid, groupid));
    
    CREATE TABLE restrictedgroups ( 
      pid number, 
      groupid number,
      name varchar2(50), 
      dateadded date, 
      since date, 
      notes varchar2(1024), 
      CONSTRAINT pk_groupid PRIMARY KEY(groupid), 
      CONSTRAINT fk_persongroup FOREIGN KEY(pid,groupid) REFERENCES groupspersonx(personid, groupid));
    

    *引用列的数量等于外键列

  • 1

    无论何时要在列上创建复合主键或唯一约束,都不能在另一个表中提供引用 .

    对于前

    sql>create table t1( a number,b number,c number ,primary key(a,b,c));
    
    table created.
    
    sql>create table g1(a number constraint con_fg references t1(a));
    
    ERROR at line 1:
    ORA-02270: no matching unique or primary key for this column-list
    

    这里t1是父表,g1是子表 . 子表可以在一列中包含重复值 . 因此oracle将不允许该列表 .

    也可以看看

    SQL>select constraint_name,constraint_type from user_constraints where table_name='T1';
    
    CONSTRAINT_NAME                C
    ------------------------------ -
    SYS_C005822                    P
    

    因此,这里也是所有三列的唯一约束,即t1表中的a,b,c .

    这就是为什么你不能在复合主键或复合唯一约束上创建外来的原因

  • 4

    你不能使用:

    CONSTRAINT fk_persongroup FOREIGN KEY(groupid) REFERENCES groupspersonx(personid, groupid)
    

    改变它:

    CONSTRAINT fk_persongroup FOREIGN KEY(groupid) REFERENCES groupspersonx(groupid)
    

    这应该工作 .

相关问题