2017-10-03 3 views
0

은 내가 하나에 여러 태그를 삽입 할방지 자동 증가 건너에 중복 키 업데이트

(ID INT auto_incrment primary key, 
tag VARCHAR unique) 

있는 테이블을 가지고있다. 이와 같이 :

INSERT INTO tags (tag) VALUES ("java"), ("php"), ("phyton"); 

나는 이것을 실행하고 "java"가 이미 테이블에 있으면 오류가 발생합니다. 그것은 "php"와 "phyton"을 추가하지 않습니다.

나는 이런 식으로 할 경우

INSERT INTO tags (tag) VALUES ("java"), ("php"), ("phyton") 
    ON DUPLICATE KEY UPDATE tag = VALUES(tag) 

가 오류없이 추가됩니다하지만 ID 필드에서이 개 값을 건너 뜁니다.

예 : 자바가 ID = 1인데 쿼리를 실행합니다. 그렇다면 PHP는 3과 Phyton 4가 될 것입니다. ID를 건너 뛰지 않고이 쿼리를 실행할 수있는 방법이 있습니까?

나는 그들 사이에 큰 공백을 원하지 않습니다. 나는 또한 INSERT IGNORE을 시도했다.

감사합니다.

+0

당신이주의를 NTO해야하지만 연속 값에 대한 그 정도, 경우 그 동작을 변경하고 싶다면, 설정 파일에'innodb_autoinc_lock_mode = 0'을 설정할 수 있습니다. [Auto Increment Skipping numbers?] (https://stackoverflow.com/q/17798835/6248528) 잠재적 인 부작용 (및 어떤 경우에 해당되는지)을 알고 있으므로 그 대답의 매뉴얼 링크를 읽으십시오. 서버 구성을 변경할 수있는 권한이 있어야합니다. 그렇지 않으면 삽입 할 때 다음 번호를 수동으로 계산할 수 있으므로 (자동 증가 기능을 사용할 수 없으므로) 간격을 걱정하지 마십시오. – Solarflare

답변

0

http://mysql.rjweb.org/doc.php/staging_table#normalization의 "SQL # 1"을 참조하십시오. 그것은 더 복잡하지만 '불타는'ID를 피합니다. 다른 테이블에 태그가 필요하다는 잠재적 단점이 있습니다. 해당 링크의 스 니펫 :

# This should not be in the main transaction, and it should be 
# done with autocommit = ON 
# In fact, it could lead to strange errors if this were part 
# of the main transaction and it ROLLBACKed. 
INSERT IGNORE INTO Hosts (host_name) 
    SELECT DISTINCT s.host_name 
     FROM Staging AS s 
     LEFT JOIN Hosts AS n ON n.host_name = s.host_name 
     WHERE n.host_id IS NULL; 

이 거래를 자체 거래로 분리하면 서둘러 완료되므로 차단이 최소화됩니다. IGNORE라고 말하면 다른 스레드가 동일한 host_names를 '동시에'삽입하는 것은 상관하지 않습니다. (당신이 그런 INSERTs을하고 다른 스레드가없는 경우, 당신이 던져 수 IGNORE.)

를 (그 다음은 IODKU에 대해 얘기에 간다.)