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

标签 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: name already used by an existing constraint

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

最佳答案

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

外键约束是为了保持引用完整性;确保您无法插入父表中不存在的值。

如果不将约束添加到 HOUSE_USER_GROUPE_ACCESR那么你就无法在该表中获得这种保护。您应该想要这种保护无处不在


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

关于sql - Oracle:多对多:需要两个外键约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30166096/

相关文章:

c# - 关键字 'User' 附近的语法不正确

mysql - 如何匹配数据库中的动态路由?

mySQL 查询 : involving 2 tables

postgresql - 创建 pgAdmin 4 主键时出现语法错误

mysql - SQL 错误#1064。使用默认值更改表

SQL Server ALTER 字段 NOT NULL 需要永远

sql - 转账中带破折号的数字不断减

linux - 如何从外网访问virtual box web服务器url

JAVA:synchronized关键字阻塞了代码块的哪一部分?并解释这个僵局

sql - SQL 中的复杂分层查询