2017-07-04 13 views
0

私は次のような問題の際にこだわっている:のは、私は自分自身への関係を持つテーブルがあるとしましょう:ユニーク制約

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); 

今度は言わせて、私はとの関係をwan't

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'); 
:指向すること、すなわち、アイテム1は、特定のタイプのアイテム2に関連している場合、アイテム2が許可されるべきではない以下の、ある項目1

に同じ関係を持つべきではないです

I tはテーブルITEM_RELATIONがこの接続の方向を定義することを意味し、逆の関係を追加することは許されません。

Oracle DBでは可能ですか?

答えて

3

これは一意のインデックスで行うことができます。オラクルでは、あなたは、インデックス内の関数を使用することができますので、これは動作します:

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); 

しかし、これは、アイテムが特定の順序で挿入されることを必要とする。

+0

ありがとう、それは私が欲しかったものです。最初の解決策は私のために働きます。 –

関連する問題