source

존재하지 않는 경우 - Mariadb 구문

manysource 2022. 11. 13. 19:34

존재하지 않는 경우 - Mariadb 구문

새 행을 삽입하거나 이미 포함된 경우 기존 행을 업데이트하려고 했습니다.

인덱스로도 해볼 수 있을 것 같았는데 솔직히 어떻게 해야 할지 몰라서 IF 문장으로 해보려고 했어요.안타깝게도 구문에도 문제가 있다고 표시되기 때문에 이것도 작동하지 않습니다.MariaDB를 사용하고 있습니다.

IF NOT EXISTS (SELECT * FROM valuation 
               WHERE ticker = 'BK001EUR' AND depot_id =1 
                 AND src_id =2 AND valuation_date ='2009-09-09')
INSERT INTO valuation (ticker,depot_id,src_id,valuation_date,value) 
VALUES ('BK001EUR',1,2,'2009-09-09',14999260.46) 
ELSE 
UPDATE valuation 
SET value =14999260.46 
WHERE ticker = 'BK001EUR' AND depot_id =1 
  AND src_id =2 AND valuation_date ='2009-09-09');

이를 위한 적절한 방법은insert ... on duplicate key update질문 내용은 다음과 같습니다.

INSERT INTO valuation (ticker, depot_id, src_id, valuation_date, value) 
  VALUES ('BK001EUR', 1, 2, '2009-09-09', 14999260.46) 
  ON DUPLICATE KEY UPDATE value = VALUES(value);

(의 사용에 주의해 주세요.VALUES()따라서 입력을 반복할 필요가 없습니다.)

이 작업을 수행하려면 관심 있는 키에 고유한 인덱스가 필요합니다.

create unique index unq_valuation_4 on valuation(ticker, depot_id, src_id, valuation_date);

중복 키는 프라이머리 키인덱스일 필요는 없습니다.
원하는 인덱스를 지정할 수 있습니다.

다음을 사용할 수 있습니다.

-- if exists then it will update
UPDATE valuation 
SET value =14999260.46 
WHERE ticker = 'BK001EUR' 
  AND depot_id =1 AND src_id =2 AND valuation_date ='2009-09-09';

-- if not exist then insert
INSERT INTO valuation (ticker,depot_id,src_id,valuation_date,value)
SELECT 'BK001EUR',1,2,'2009-09-09',14999260.46
-- FROM dual
WHERE NOT EXISTS (SELECT 1 
                  FROM valuation 
                   WHERE ticker = 'BK001EUR' 
                     AND depot_id =1 
                     AND src_id =2 AND valuation_date ='2009-09-09');

db <> 데모 표시

또는 더 나은 방법:

INSERT INTO valuation (ticker,depot_id,src_id,valuation_date,value) 
VALUES ('BK001EUR',1,2,'2009-09-09',14999260.46)
ON DUPLICATE KEY UPDATE value =14999260.46;

같은 값의 레코드가 있는 경우 데이터를 삽입해서는 안 되는 유사한 INSERT-스테이트먼트를 시도했습니다.'FROM DUAL'을 추가할 때까지 내 문장은 작동하지 않았습니다.

INSERT INTO measurement
    (sensorid, parameterid, measuredatetime, measure)
    SELECT sensoridIn,parameteridIn,measuredatetimeIn,measureIn
    FROM DUAL
    WHERE NOT EXISTS (SELECT *
          FROM measurement
          WHERE sensorid = sensorId
          AND measuredatetime = measuredatetimeIn
          AND measure = measureIn
          AND parameterid = parameteridIn);

자세한 내용은 https://mariadb.com/kb/en/dual/ 및 MySQL에서 '존재하지 않는 경우 삽입'을 수행하는 방법을 참조하십시오.

언급URL : https://stackoverflow.com/questions/45689582/if-not-exists-mariadb-syntax