【问题标题】:Unique constraint on two database columns with reverse direction反向两个数据库列的唯一约束
【发布时间】:2017-07-04 13:59:48
【问题描述】:

我遇到了以下问题:假设我有一个与自身有关系的表:

CREATE TABLE ITEM (
    ID NUMBER(18) PRIMARY KEY,
    NAME VARCHAR2(100 CHAR) NOT NULL
);

ALTER TABLE ITEM ADD CONSTRAINT PK_ITEM PRIMARY KEY (ID);

CREATE TABLE ITEM_RELATION (
    FIRST_ITEM_ID NUMBER(18) NOT NULL,
    SECOND_ITEM_ID NUMBER(18) NOT NULL,
    RELATION_TYPE VARCHAR2(1) NOT NULL
);

ALTER TABLE ITEM_RELATION ADD CONSTRAINT PK_ITEM_RELATION PRIMARY KEY (FIRST_ITEM_ID, SECOND_ITEM_ID, RELATION_TYPE);
--ALTER TABLE ITEM_RELATION ADD CONSTRAINT UK_ITEMS UNIQUE (FIRST_ITEM_ID, SECOND_ITEM_ID, RELATION_TYPE);
ALTER TABLE ITEM_RELATION ADD CONSTRAINT FK_FIRST_ITEM FOREIGN KEY (FIRST_ITEM_ID) REFERENCES ITEM(ID);
ALTER TABLE ITEM_RELATION ADD CONSTRAINT FK_SECOND_ITEM FOREIGN KEY (SECOND_ITEM_ID) REFERENCES ITEM(ID);

现在让我们说,我不希望关系是定向的,也就是说,如果项目 1 与某种类型的项目 2 有关系,那么项目 2 不应该与项目 1 有相同的关系。

也就是说,不允许出现以下情况:

INSERT INTO ITEM (ID, NAME) VALUES (1, 'Item 1');
INSERT INTO ITEM (ID, NAME) VALUES (2, 'Item 2');
INSERT INTO ITEM_RELATION(FIRST_ITEM_ID, SECOND_ITEM_ID, RELATION_TYPE) VALUES (1, 2, 'R');
INSERT INTO ITEM_RELATION(FIRST_ITEM_ID, SECOND_ITEM_ID, RELATION_TYPE) VALUES (2, 1, 'R');

表示ITEM_RELATION这个表定义了这个连接的方向,不允许添加反向关系。

Oracle DB 可以吗?

【问题讨论】:

    标签: sql oracle unique-constraint


    【解决方案1】:

    您可以使用唯一索引来做到这一点。在 Oracle 中,您可以在索引中使用函数,这样就可以了:

    create unique index unq_item_relation_3 on
         item_relation(RELATION_TYPE ,
                       least(FIRST_ITEM_ID, SECOND_ITEM_ID),
                       greatest(FIRST_ITEM_ID, SECOND_ITEM_ID)
                      );
    

    通过要求FIRST_ITEM_ID 小于SECOND_ITEM_ID,您可以使用check 约束获得相同的效果:

    alter table item_relation add constraint chk_item_relation_2
        check ((FIRST_ITEM_ID < SECOND_ITEM_ID);
    

    但是,这需要以特定顺序插入项目。

    【讨论】:

    • 谢谢,这正是我想要的,第一个解决方案对我有用。
    猜你喜欢
    • 2010-12-03
    • 2021-08-05
    • 1970-01-01
    • 2017-04-23
    • 1970-01-01
    • 2013-05-21
    • 1970-01-01
    • 1970-01-01
    • 2013-01-21
    相关资源
    最近更新 更多