programing

mysql - 빈 테이블에 존재하지 않는 위치에 선택 항목 삽입

shortcode 2022. 10. 25. 20:26
반응형

mysql - 빈 테이블에 존재하지 않는 위치에 선택 항목 삽입

그래서 다음과 같은 질문 예가 있습니다.

INSERT INTO company (name)
SELECT 'test'
FROM company
WHERE
  NOT EXISTS (SELECT 'test' FROM company WHERE name = 'test');

단, 테이블이 비어 있는 경우에는 동작하지 않습니다.

이런 게 통할 줄 알았는데

INSERT INTO company (name)
SELECT 'test'
FROM company
WHERE
  (SELECT COUNT(*) FROM company) = 0
  OR
  NOT EXISTS (SELECT 'test' FROM company WHERE name = 'test');

하지만 그것도 효과가 없었다.좋은 생각 있어요?

http://sqlfiddle.com/ #!9/5747f0/1

다음 쿼리를 자세히 확인합니다.

INSERT INTO company (name)
SELECT 'test'
FROM company
WHERE
    NOT EXISTS (SELECT 'test' FROM company WHERE name = 'test');

그 이후로는company테이블이 현재 비어 있습니다.이 쿼리에서 레코드는 반환되지 않습니다.WHERE EXISTS그건 그렇고 완전히 맞는 논리죠대신 을 사용하는 경우dual테이블에서 쿼리가 동작하는 것을 확인할 수 있습니다.

INSERT INTO company (name)
SELECT 'test'
FROM dual
WHERE
     NOT EXISTS (SELECT 'test' FROM company WHERE name = 'test');

MYSQL 중복 삽입에 대한 자동 증가를 방지하기 에 이 문제가 발생한 적이 없습니다.

나는 이 솔루션이 좋다.

INSERT INTO COMPANY (NAME) SELECT 'TEST' AS INNAME FROM DUAL
WHERE NOT EXISTS(
    SELECT NAME FROM COMPANY
    WHERE NAME = 'TEST'
    LIMIT 1
);

MariaDB [sandbox]> DROP TABLE IF EXISTS COMPANY;
Query OK, 0 rows affected (0.12 sec)

MariaDB [sandbox]> CREATE TABLE COMPANY (ID INT AUTO_INCREMENT PRIMARY KEY, NAME VARCHAR(10), UNIQUE (NAME));
Query OK, 0 rows affected (0.24 sec)

MariaDB [sandbox]>
MariaDB [sandbox]> INSERT INTO COMPANY (NAME) VALUES ('TEST');
Query OK, 1 row affected (0.08 sec)

MariaDB [sandbox]>
MariaDB [sandbox]> INSERT INTO COMPANY (NAME) SELECT 'TEST' AS INNAME FROM DUAL
    -> WHERE NOT EXISTS(
    ->     SELECT NAME FROM COMPANY
    ->     WHERE NAME = 'TEST'
    ->     LIMIT 1
    -> );
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0

MariaDB [sandbox]>
MariaDB [sandbox]> INSERT INTO COMPANY (NAME) SELECT 'ABC' AS INNAME FROM DUAL
    -> WHERE NOT EXISTS(
    ->     SELECT NAME FROM COMPANY
    ->     WHERE NAME = 'ABC'
    ->     LIMIT 1
    -> );
Query OK, 1 row affected (0.10 sec)
Records: 1  Duplicates: 0  Warnings: 0

MariaDB [sandbox]>
MariaDB [sandbox]> SELECT * FROM COMPANY;
+----+------+
| ID | NAME |
+----+------+
|  2 | ABC  |
|  1 | TEST |
+----+------+
2 rows in set (0.00 sec)

바퀴를 재창조하는 것 같네요.보다 간단한 접근방식은 다음과 같이 정의하는 것입니다.name고유 키(또는 프라이머리 키)로 지정한 후insert ignore구문:

INSERT IGNORE INTO company(name) VALUES ('test')

언급URL : https://stackoverflow.com/questions/46020954/mysql-insert-select-where-not-exists-on-empty-table

반응형