2013-01-31 2 views
2

내가 가진이MySQL을 삽입 그렇지 않으면 업데이트

CREATE TABLE IF NOT EXISTS tbl_member_doc_read (
`read_id` INTEGER(10) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT , 
`member_id` INTEGER(10) UNSIGNED NOT NULL , 
`doc_id` INTEGER(10) UNSIGNED NOT NULL , 
`status` INTEGER(1) DEFAULT '0', 
FOREIGN KEY (`member_id`) REFERENCES tbl_member(`member_id`), 
FOREIGN KEY (`doc_id`) REFERENCES tbl_doc(`doc_id`) 
) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci; 

같은 MySQL의 테이블은 말할 수

read_id member_id doc_id status 
1   1   1  1 
2   1   2  0 
3   2   2  1 

가 지금은 결합 할 경우 해당 테이블에 삽입 할 테이블 예를 들어, 데이터 ID 또는 쌍 (member_id, doc_id)이 존재합니다. 상태가 0 인 경우 업데이트 상태입니다. 여기에 사용 된 쿼리는

입니다.
INSERT INTO tbl_member_doc_read (member_id, doc_id, status) VALUES(1,2,1) ON DUPLICATE KEY UPDATE status = VALUES(status) WHERE status = 0; 

는 데이터 2 1 2 1

난이

INSERT INTO tbl_member_doc_read (member_id, doc_id, status) VALUES(2,1,0) ON DUPLICATE KEY UPDATE status = VALUES(status) WHERE status = 0; 

을 삽입하는 경우는 데이터 4 2 1 0

가진 새로운 행을 삽입한다과 제 2 열을 갱신해야하지만 못해 이것을 해결하십시오. 또한 innodb 엔진에서는 member_id로 생각하고 doc_id는 다른 테이블의 기본 키를 참조하여 고유합니다. innodb에서는 고유 인덱스를 만들 수 없습니다.

도움이 될 것입니다. 미리 감사드립니다. , 당신은 두 개의 열을 unique 키를 정의하는 데 필요한 ON DUPLICATE KEY UPDATE 문을 작동하기 위해

+0

'상태'가 다른 것일 수 있습니까? 1 또는 0보다? 그렇지 않으면 WHERE 조건이 중복됩니다. – Strawberry

+0

이중화 키 업데이트는 테이블 –

답변

2

,

CREATE TABLE IF NOT EXISTS tbl_member_doc_read 
(
`read_id` INTEGER(10) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT , 
`member_id` INTEGER(10) UNSIGNED NOT NULL , 
`doc_id` INTEGER(10) UNSIGNED NOT NULL , 
`status` INTEGER(1) DEFAULT '0', 
FOREIGN KEY (`member_id`) REFERENCES tbl_member(`member_id`), 
FOREIGN KEY (`doc_id`) REFERENCES tbl_doc(`doc_id`), 
CONSTRAINT tb_uq UNIQUE (member_id, doc_id) 
) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci; 

는 다음 WHERE 절을 제거

INSERT INTO tbl_member_doc_read (member_id, doc_id, status) 
VALUES(1,2,1) 
ON DUPLICATE KEY UPDATE 
status = VALUES(status) 
+0

에서 UNIQUE로 선언 된 열이있는 경우에만 작동합니다. 고맙습니다. –

+0

''D' –

+0

SQLFiddle 데모 링크가 깨졌습니다. :( – Sablefoste

관련 문제