반응형
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
반응형
'programing' 카테고리의 다른 글
장고 "하위 행을 추가하거나 업데이트할 수 없습니다. 외부 키 제약 조건이 실패합니다." (0) | 2022.10.25 |
---|---|
PHP를 사용하여 클라이언트 IP 주소 가져오기 (0) | 2022.10.25 |
C를 사용한 JSON 해석 (0) | 2022.10.25 |
기능 조기 종료? (0) | 2022.10.25 |
구성 요소가 로드될 때 데이터를 검색하는 방법 (0) | 2022.10.25 |