[mysql] MySQL 조건부 삽입

조건부 INSERT를 형성하는 데 어려움을 겪고 있습니다.

인스턴스 ID가 고유 한 열 (인스턴스, 사용자, 항목)이있는 x_table이 있습니다. 사용자에게 이미 주어진 항목이없는 경우에만 새 행을 삽입하고 싶습니다.

예를 들어 instance = 919191 user = 123 item = 456을 삽입하려고합니다.

Insert into x_table (instance, user, item) values (919191, 123, 456)
    ONLY IF there are no rows where user=123 and item=456 

올바른 방향으로의 도움이나 안내를 많이 주시면 감사하겠습니다.



답변

DBMS가 삽입을 실행할 때 선택하는 테이블에 제한을 두지 않으면 다음을 시도하십시오.

INSERT INTO x_table(instance, user, item)
    SELECT 919191, 123, 456
        FROM dual
        WHERE NOT EXISTS (SELECT * FROM x_table
                             WHERE user = 123
                               AND item = 456)

여기에는 dual하나의 행만있는 테이블이 있습니다 (원래 Oracle에서 발견되었지만 현재는 mysql에서도 발견됨). 논리는 SELECT 문이 필요한 값이있는 단일 데이터 행을 생성하지만 값이 아직 발견되지 않은 경우에만 생성된다는 것입니다.

또는 MERGE 문을보십시오.


답변

INSERT IGNORE(사용자, 항목)에 고유 인덱스가있을 때 행을 업데이트하거나 삽입하는 대신 삽입을 자동으로 무시하는 것을 사용할 수도 있습니다 .

쿼리는 다음과 같습니다.

INSERT IGNORE INTO x_table(instance, user, item) VALUES (919191, 123, 456)

를 사용하여 고유 인덱스를 추가 할 수 있습니다 CREATE UNIQUE INDEX user_item ON x_table (user, item).


답변

이런 식으로 해본 적이 있습니까?

INSERT INTO x_table
SELECT 919191 as instance, 123 as user, 456 as item
FROM x_table
WHERE (user=123 and item=456)
HAVING COUNT(*) = 0;


답변

를 사용하여 다음 UNIQUE(user, item)을 수행하십시오.

Insert into x_table (instance, user, item) values (919191, 123, 456)
  ON DUPLICATE KEY UPDATE user=123

user=123비트는 ON DUPLICATE중복이있을 때 실제로 아무것도하지 않고 절의 구문과 일치하는 “no-op” 입니다.


답변

고유 한 제약 조건을 설정하지 않으려는 경우 매력처럼 작동합니다.

INSERT INTO `table` (`column1`, `column2`) SELECT 'value1', 'value2' FROM `table` WHERE `column1` = 'value1' AND `column2` = 'value2' HAVING COUNT(`column1`) = 0

도움이 되길 바랍니다!


답변

당신이 원하는 것은 INSERT INTO table (...) SELECT ... WHERE .... 에서 MySQL을 5.6 수동 .

당신의 경우 :

INSERT INTO x_table (instance, user, item) SELECT 919191, 123, 456
WHERE (SELECT COUNT(*) FROM x_table WHERE user=123 AND item=456) = 0

또는 실행 여부를 결정하기 위해 복잡한 논리를 사용하지 않기 때문에이 두 열의 조합에 키를 INSERT설정 한 UNIQUE다음 INSERT IGNORE.


답변

(x_table.user, x_table.item)이 고유 한 제약 조건을 추가하면 동일한 사용자 및 항목이있는 다른 행을 삽입 할 수 없습니다.

예 :

mysql> create table x_table ( instance integer primary key auto_increment, user integer, item integer, unique (user, item));
Query OK, 0 rows affected (0.00 sec)

mysql> insert into x_table (user, item) values (1,2),(3,4);
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> insert into x_table (user, item) values (1,6);
Query OK, 1 row affected (0.00 sec)

mysql> insert into x_table (user, item) values (1,2);
ERROR 1062 (23000): Duplicate entry '1-2' for key 2