복붙노트

[SQL] 기록이 존재하지 않는 경우에만 테이블에 SQL 삽입 [중복]

SQL

기록이 존재하지 않는 경우에만 테이블에 SQL 삽입 [중복]

나는 SQL 테이블에 있지만 특정 조건을 만족하는 기록이 충족 될 경우 일부 데이터를 삽입하는 쿼리의 집합을 실행합니다. 아이디 (주), fund_id, 날짜 및 가격 : 표는 4 개 필드가

fund_id, 날짜 및 가격 : 나는 쿼리에 3 개 필드를 가지고있다.

내 쿼리는 다음과 같이 갈 것입니다 그래서 :

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 날짜와 일치하는 레코드가 이미 존재하지 않는 경우. 위의 IS가 해결되면 추가 선택 문으로 이것을 달성하는 매우 비효율적 인 방법마다 실행해야합니다으로 나를 친다.

위를 달성하는 더 좋은 방법이 있나요?

편집 : 명확한 설명도 fund_id이나 날짜는 고유 한 필드입니다; 같은 fund_id 또는 날짜를 공유하는 레코드가 존재하지만 어떤 기록도 다른 같은 fund_id과 날짜 모두가 없어야한다.

해결법

  1. ==============================

    1.이 이것을 달성 할 수있는 간단한 해결책이 될 수 있습니다

    이 이것을 달성 할 수있는 간단한 해결책이 될 수 있습니다

    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'));
    

    추신. 대안 (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
    

    이 바이올린을 참조하십시오.

  2. ==============================

    2.선택 나는 원래 표시된 대답은 정확하고 실현 비록 내가 (다른 사람들은 인정하지만,에 가지 않았다)이 일을 더 나은 방법이 무엇을 요구. 복합 고유 인덱스는 fund_id과 날짜로 구성된 테이블을 만들어야합니다.

    선택 나는 원래 표시된 대답은 정확하고 실현 비록 내가 (다른 사람들은 인정하지만,에 가지 않았다)이 일을 더 나은 방법이 무엇을 요구. 복합 고유 인덱스는 fund_id과 날짜로 구성된 테이블을 만들어야합니다.

    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 값을 가질 수 없다는 경고와 함께 제공됩니다.

  3. ==============================

    3.당신이 DDL을 수정할 수 없습니다 가정하면 (고유 제약 조건을 만들 수 있습니다) 또는 유일한 다음 DML 쓰기 전체 테이블에 대한 당신의 가치의 필터링 된 결과에 널을 확인 할 수있는 제한됩니다

    당신이 DDL을 수정할 수 없습니다 가정하면 (고유 제약 조건을 만들 수 있습니다) 또는 유일한 다음 DML 쓰기 전체 테이블에 대한 당신의 가치의 필터링 된 결과에 널을 확인 할 수있는 제한됩니다

    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
    
  4. from https://stackoverflow.com/questions/16460397/sql-insert-into-table-only-if-record-doesnt-exist by cc-by-sa and MIT license