Oracle:多对多:需要两个外键约束?

时间:2015-05-11 11:07:37

标签: sql oracle ddl

我是SQL的新手,我试图建立多对多的关系:

CREATE TABLE HOUSE_USER
(
    USER_ID NUMBER(10) NOT NULL,
    USER_EMAIL VARCHAR(255) NOT NULL,
    USER_PASSWORD VARCHAR(255) NOT NULL,
    CONSTRAINT USER_PK PRIMARY KEY(USER_ID),
    CONSTRAINT PROFILE_FK FOREIGN KEY(PROFILE_ID) REFERENCES HOUSE_PROFILE(PROFILE_ID)
);

CREATE TABLE HOUSE_USER_GROUPE
(
    USER_GROUPE_ID NUMBER(10) NOT NULL,
    USER_GROUPE_NAME VARCHAR(255) NOT NULL,
    CONSTRAINT USER_GROUPE_PK PRIMARY KEY(USER_GROUPE_ID)
);

CREATE TABLE HOUSE_USER_USER_GROUPE
(
    USER_ID NUMBER(10) NOT NULL,
    USER_GROUPE_ID NUMBER(10) NOT NULL,
    CONSTRAINT USER_USER_GROUPE_PK PRIMARY KEY(USER_ID, USER_GROUPE_ID),
    CONSTRAINT USER_FK FOREIGN KEY(USER_ID) REFERENCES HOUSE_USER(USER_ID),
    CONSTRAINT USER_GROUPE_FK FOREIGN KEY(USER_GROUPE_ID) REFERENCES HOUSE_USER_GROUPE(USER_GROUPE_ID)
);

我现在需要问这两个限制因素:

CONSTRAINT USER_FK FOREIGN KEY(USER_ID) REFERENCES HOUSE_USER(USER_ID),
CONSTRAINT USER_GROUPE_FK FOREIGN KEY(USER_GROUPE_ID) REFERENCES 

是否有必要。我问,因为我有另外多对多的关系:

CREATE TABLE HOUSE_USER_GROUPE
(
    USER_GROUPE_ID NUMBER(10) NOT NULL,
    USER_GROUPE_NAME VARCHAR(255) NOT NULL,
    CONSTRAINT USER_GROUPE_PK PRIMARY KEY(USER_GROUPE_ID)
);

CREATE TABLE HOUSE_ACCESSR
(
    ACCESSR_ID NUMBER(10) NOT NULL,
    ACCESSR_NAME VARCHAR(255) NOT NULL,
    CONSTRAINT ACCESSR_PK PRIMARY KEY(ACCESSR_ID)
);

CREATE TABLE HOUSE_USER_GROUPE_ACCESR
(
    USER_GROUPE_ID NUMBER(10) NOT NULL,
    ACCESSR_ID NUMBER(10) NOT NULL,
    CONSTRAINT USER_GROUPE_ACCESSR_PK PRIMARY KEY(USER_GROUPE_ID, ACCESSR_ID),
    CONSTRAINT USER_GROUPE_FK FOREIGN KEY(USER_GROUPE_ID) REFERENCES HOUSE_USER_GROUPE(USER_GROUPE_ID),
    CONSTRAINT ACCESSR_FK FOREIGN KEY(ACCESSR_ID) REFERENCES HOUSE_ACCESSR(ACCESSR_ID)
);

我无法创建第二个多对多表,因为我已经使用了约束:

CONSTRAINT USER_GROUPE_FK FOREIGN KEY(USER_GROUPE_ID) REFERENCES HOUSE_USER_GROUPE(USER_GROUPE_ID),

我可以重命名它,但是因为那个错误:

  

ORA-02264:现有约束已使用的名称

我只是想知道这些限制是否是强制性的。

2 个答案:

答案 0 :(得分:1)

,您应该在两个表上创建外键约束。

外键的限制是保持参照完整性;确保您不能插入父表中不存在的值。

如果您没有将约束添加到HOUSE_USER_GROUPE_ACCESR,那么您不会在该表中获得该保护。并且应该希望无处不在


唯一明显的错误是约束名称彼此相同。我传统上要么包含No Name (让Oracle决定名称,因为我从不引用名称约束)或使用类似fk_<table>_<field>的格式。

答案 1 :(得分:1)

您需要执行约束..使用其他名称创建第二个约束。