2012-08-31 3 views
2

의가 나는 다음과 같은 테이블이 있다고 가정하자 :mysql에서 외래 키 제약 조건에 0을 허용하는 방법은 무엇입니까?

UID int (11) not null, FOREIGN KEY (UID) REFERENCES users(ID), 
OID int (11), FOREIGN KEY (OID) REFERENCES orders(ID), 
primary key(UID,OID) 

참고 기본 키.

그리고 각각의 사용자 ID (UID)에 대해 NULL의 ID (OID)를 순서대로 허용하고 싶습니다.

기본 키를 설정하면 자동으로 OID 필드가 이됩니다.

주변의 해결 방법으로 나는 관련이없는 필드로 표시하기 위해 0을 대신 저장하려고 생각합니다.

이제 외래 키 제약 조건이 지정된 필드의 references과 떨어져 0도 허용하도록 허용 할 수 있습니까?

답변

0

UNIQUE KEY 제약이 경우에 사용할 수 있습니다

CREATE TABLE users (id int not null, primary key (id)); 
INSERT INTO users VALUES (1), (2), (3); 

CREATE TABLE orders (id int not null, primary key (id)); 
INSERT INTO orders VALUES (1), (2), (3); 

CREATE TABLE users_orders (uid int NOT NULL, oid int DEFAULT NULL, 
       FOREIGN KEY (uid) REFERENCES users (id), 
       FOREIGN KEY (oid) REFERENCES orders (id), 
       UNIQUE KEY (uid, oid)); 

INSERT INTO users_orders (uid) VALUES (1); 

여기 놀 a demo입니다.

하지만 테이블에 specific UID - NULL의 조합 (여전히 InnoDB을 사용한다고 가정)을 계속 삽입 할 수 있습니다. 예를 들어,이 쿼리는 ...

INSERT INTO users_orders o (uid) VALUES (1), (1); 

... (기존 제약 조건을 위반하지 않으므로) 성공할 것입니다. 이 엄격히 금지되어야하는 경우

, 당신은 더 나은뿐만 아니라 usersorders 표에 몇 가지 더미 값 모두를 사용 - 당신의 교차 테이블의 foreign key 제약 사용할 수 있도록 할 수 있습니다.

사이드 노트로, 나는이 상황에 조금 놀랐다. 교차 테이블은 대개 NULL 가능 필드가 없도록 설계되어 있습니다. 예를 들어 주문이없는 사용자를 포함시키는 데 사용되는 쿼리에서 LEFT (또는 RIGHT) JOIN입니다. 이 결정 (OID를 사용할 수 없게 만드는 것)이 처음에 선택된 이유를 조금 설명 할 수 있습니까?

+0

아이디어는 결제 정보를 저장하는 것입니다. 각 사용자에게는 기본 결제 정보가 있으며 각 주문에 대해 별도로 저장됩니다. 만약 당신이 그것을 저장하는 다른 방법을 조언한다면 나는 기꺼이 그것을 따라갈 것이다 ... – Anonymous

+0

글쎄, 어떻게'uid'를'orders' 테이블에 추가하는 것이 적절하지 않다고 생각 하는가?) 각 주문 (내가 추측)에는 단 하나의 사용자가 할당되어 있습니다.그러면 모든 사용자와 그들의 주문 (LEFT JOIN을 통해 주문이 전혀없는 사용자를 포함하여)을 쉽게 조회 할 수 있습니다. – raina77ow

+0

그건 의미가 있습니다. 각 주문 내에서 결제 정보도 저장할 수 있습니다. 하지만 기본 결제를 어디에 보관해야할까요? – Anonymous

0

MySQL에서는 가능하지 않다고 생각하지만 해결 방법은 외부 테이블을 참조 할 때 값이 0 인 더미 항목을 삽입하는 것입니다.

+0

그래, 그게 내가 처음으로 생각한 것인데, 그것은 실제로 관계에 영향을 미치고 관련 분야가되기 때문에 더러운 방식처럼 보이지만 이상적으로는 그러한 분야에 대해 어떤 관계도 없어야합니다. – Anonymous

1

하나의 옵션은 현재 PK 대신 '대리 일차 키'를 사용하고 대신 다음 합성 (UID, OID)에 UNIQUE 제약 조건을 넣는 것입니다. - 대리 키가있는 경우 식별 열

+0

좋은 생각입니다.하지만 기본 키를 가지고 있지 않은 것에 대한 성능에 영향을 미치지 않을까요? 색인을 수동으로 정의해야 할 필요가 있습니까, 아니면 그렇게 사용할 수 있습니까? – Anonymous

+0

UID, OID에 색인을 작성해야하지만 성능 우려가 있습니다. – InSane

+0

UNIQUE KEY (uid, oid)는 실제로이 두 필드에 복합 색인을 작성합니다. – raina77ow

0

고유 키를 사용해보십시오. NULL 값을 사용할 수 있습니다.