Development Tip

SQL 레코드가 존재하지 않는 경우에만 테이블에 삽입

yourdevel 2020. 11. 24. 20:01
반응형

SQL 레코드가 존재하지 않는 경우에만 테이블에 삽입


이 질문에 이미 답변이 있습니다.

SQL 테이블에 일부 데이터를 삽입하기 위해 일련의 쿼리를 실행하고 싶지만 특정 기준을 충족하는 레코드가 충족되는 경우에만 가능합니다. 테이블에는 id(기본) fund_id,, dateprice

쿼리에 fund_id, dateprice.

따라서 내 쿼리는 다음과 같습니다.

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

반응형