2016-10-06 3 views
0

이전에 행이 업데이트되고 새 행이 추가 될 관계 테이블에 행을 추가하고 싶습니다. 내가 생각하는 행 ID의 장소에 배치하는 일 INSERT ... 수행 방법 이전 및 새 행을 사용하여 주요 업데이트를 중복 제거 하시겠습니까?

INSERT INTO table_rel (ID, player, team, status) VALUES (1,1,1,0), (2,3,1,1) 
ON DUPLICATE KEY UPDATE status=VALUES(status); 

을 생성 할 : 여기 내 쿼리 (ID 유일한 키입니다)입니까? 예. (false,2,1,1)

+1

그냥 자리가 없습니다 : 공급 NULL이 아닌 값이 다른 행과 함께 AUTO_INCREMENT 컬럼에 NULL 키워드를 공급


데모. em – Drew

+0

... 생략하거나 NULL 키워드를 사용하거나 NULL로 평가되는 식을 사용하여 NULL 값을 제공하십시오. 데모에 대한 내 대답을보십시오. – spencer7593

답변

1

AUTO_INCREMENT 열의 경우 NULL 값을 제공 할 수 있습니다. 이 작업을 수행하는 가장 쉬운 방법은 당신이 NULL 값을 반환하는 데 사용할 수있는 다른 표현이 많이 있습니다 키워드 NULL

INSERT INTO table_rel (ID, player, team, status) VALUES 
    (1,1,1,0) 
,(2,3,1,1) 
,(NULL,6,1,0) 
    ^^^^ 

입니다. auto_incs에 대한

CREATE TABLE foo 
(id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY 
, mi VARCHAR(5) 
) ENGINE=INNODB; 
; 

INSERT INTO foo (id, mi) VALUES 
(1,'1') 
,(NULL,'too') 
; 
-- 2 row(s) affected 

INSERT INTO foo (id, mi) VALUES 
(1,'one') 
,(NULL,'three') 
,(2,'two') 
ON DUPLICATE KEY 
UPDATE mi = VALUES(mi) 
; 
-- 5 row(s) affected 

SELECT * FROM foo 
; 
-- id mi 
-- --- ------ 
-- 1 one 
-- 2 two 
-- 3 three 
1

그렇지 않습니다. 다음을 포함합니다 :

INSERT INTO table_rel (ID, player, team, status) ... 

귀하는 모든 나열된 값을 제공하기 위해 노력하고 있습니다. 그런 다음

... VALUES (1,1,1,0), (2,3,1,1) 
ON DUPLICATE KEY UPDATE status=VALUES(status); 

당신은 실제 값을 제공하고, ID는 (심지어에 대한 새 항목을) 포함. 이 경우 ID=1 또는 ID=2이 없으면 입력이 생성되고, 그렇지 않은 경우 중복 키 value을 덮어 씁니다.

그런 다음 다른 문 (누락 된 열을 참고)를 사용하는이 새로운 항목에 대한 키를 지정하지 않으려면 다른 방법 :

INSERT INTO table_rel (player, team, status) VALUES (1,1,0), (3,1,1) 

table_rel 것을 제공은 IDAUTO_INCREMENT 옵션이 있습니다 (단지 경우 : ALTER TABLE table_rel MODIFY ID INTEGER NOT NULL AUTO_INCREMENT;).

UPDATE : AUTO_INCREMENT에 의존 당신은 NULL 키를 제공하고 엔진이 당신을 위해 새로운 키를 생성하도록 할 수 있습니다. 보다 자세한 설명은 spencer7593's answer을 참조하십시오.

+0

ID를 모두 생략합니까? '(, 1,1,0)'에서처럼 또는'(1,1,0)'이 누락 된 값을 제공하고 SQL은 ID임을 알 수 있습니까? 테이블에 자동 증가가 있고 하나의 돌로 2 마리의 새를 치고 싶었고 @ spencer7593에 의해 지적 된 바와 같이 –

+0

으로'(NULL, 1, 1,0)'을 사용해야하고 그렇지 않으면 두 번째 명령문을'(1,1,0)'. '(, 1,1,0)'은 유효한 구문이 아닙니다. – Batsu