SQL 레코드가 존재하지 않는 경우에만 테이블에 삽입
이 질문에 이미 답변이 있습니다.
- 행이 있는지 확인하고 그렇지 않으면 11 개의 답변을 삽입 합니다.
- MySQL 조건부 삽입 12 답변
SQL 테이블에 일부 데이터를 삽입하기 위해 일련의 쿼리를 실행하고 싶지만 특정 기준을 충족하는 레코드가 충족되는 경우에만 가능합니다. 테이블에는 id
(기본) fund_id
,, date
및price
쿼리에 fund_id
, date
및 price
.
따라서 내 쿼리는 다음과 같습니다.
INSERT INTO funds (fund_id, date, price)
VALUES (23, '2013-02-12', 22.43)
WHERE NOT EXISTS (
SELECT *
FROM funds
WHERE fund_id = 23
AND date = '2013-02-12'
);
따라서 fund_id
와 일치하는 레코드 date
가 이미 존재하지 않는 경우에만 데이터를 삽입하고 싶습니다 . 위의 내용이 맞다면 매번 추가 select 문을 실행해야하므로이를 달성하는 데 상당히 비효율적 인 방법이됩니다.
위의 사항을 달성하는 더 좋은 방법이 있습니까?
편집 : 설명을 위해 고유 필드 도 fund_id
아닙니다 date
. 같은 fund_id 또는 날짜를 공유하는 레코드는 존재하지만 다른 레코드와 같은 fund_id 및 날짜를 가진 레코드는 없어야합니다.
이를 달성하기위한 간단한 해결책이 될 수 있습니다.
INSERT INTO funds (ID, date, price)
SELECT 23, DATE('2013-02-12'), 22.5
FROM dual
WHERE NOT EXISTS (SELECT 1
FROM funds
WHERE ID = 23
AND date = DATE('2013-02-12'));
ps 또는 ID
기본 키인 경우 :
INSERT INTO funds (ID, date, price)
VALUES (23, DATE('2013-02-12'), 22.5)
ON DUPLICATE KEY UPDATE ID = 23; -- or whatever you need
이 바이올린을 참조하십시오 .
내가 원래 선택한 것으로 표시 한 답변이 정확하고 내가 요청한 것을 달성하더라도이를 수행하는 더 좋은 방법이 있습니다 (다른 사람들이 인정했지만 들어 가지 않은 것). fund_id
및 로 구성된 테이블에 복합 고유 인덱스를 만들어야합니다 date
.
ALTER TABLE funds ADD UNIQUE KEY `fund_date` (`fund_id`, `date`);
그런 다음 레코드를 삽입 할 때 충돌이 발생할 때 조건을 추가하십시오.
INSERT INTO funds (`fund_id`, `date`, `price`)
VALUES (23, DATE('2013-02-12'), 22.5)
ON DUPLICATE KEY UPDATE `price` = `price`; --this keeps the price what it was (no change to the table) or:
INSERT INTO funds (`fund_id`, `date`, `price`)
VALUES (23, DATE('2013-02-12'), 22.5)
ON DUPLICATE KEY UPDATE `price` = 22.5; --this updates the price to the new value
이렇게하면 하위 쿼리에 훨씬 더 나은 성능을 제공하고 테이블 구조가 우수합니다. 고유 키 열에는 여전히 MySQL에서 값으로 처리되므로 NULL 값을 가질 수 없다는 경고가 있습니다.
DDL을 수정할 수 없거나 (고유 한 제약 조건을 만들기 위해) DML을 작성할 수있는 것으로 제한되어 있다고 가정하고 전체 테이블에 대해 필터링 된 값의 결과에 대해 null을 확인합니다.
깡깡이
insert into funds (ID, date, price)
select
T.*
from
(select 23 ID, '2013-02-12' date, 22.43 price) T
left join
funds on funds.ID = T.ID and funds.date = T.date
where
funds.ID is null
참고 URL : https://stackoverflow.com/questions/16460397/sql-insert-into-table-only-if-record-doesnt-exist
'Development Tip' 카테고리의 다른 글
공개적으로는 읽기 전용이지만 전용 setter가있는 Objective-C 속성 (0) | 2020.11.24 |
---|---|
사용자 지정 메타 데이터 또는 구성을 package.json에 추가합니다. 유효합니까? (0) | 2020.11.24 |
Kotlin의 정적 초기화 블록 (0) | 2020.11.24 |
.NET Core- "dotnet new sln"을 사용하는 경우 (0) | 2020.11.24 |
Python에서 "global"문을 사용합니까? (0) | 2020.11.24 |