在MariaDB中进行合并(匹配时更新,不匹配时插入)

问题描述 投票:0回答:1

我正在尝试对 MariaDB DB 进行合并。 如果表中不存在 ASIN,我需要插入值,或者如果存在则更新值。

MERGE INTO asin_list al USING ( SELECT asin FROM asin_list WHERE asin = 'B006UCNI38' ) alexist ON ( al.asin = alexist.asin ) 
WHEN MATCHED THEN
UPDATE 
    SET al.updated_at = '2022-03-13 12:11:21', al.price=19.85, al.product_quantity=10
    WHEN NOT MATCHED THEN
    INSERT ( asin, price, seller, shipping_cost, dispatch_time, product_type, product_quantity, aditional_scraped, created_at, updated_at, seller_name, brand, scraped_at )
VALUES
    ( 'B006UCNI38', 7.49, 'SBA', 0, '', 'PRIME', 30, 1, '2022-03-13 12:11:21', '2022-03-13 12:11:21', 'Amazon', 'WD-40', '2022-03-13 12:11:21' );

但是我收到一个错误:

1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version

你能帮我解决这个问题吗? 请记住,如果我在 mySql 中进行相同的查询,它会起作用,问题仅与 MaridDb 相关。

sql mariadb
1个回答
1
投票

在撰写本文时,MariaDB 不支持

MERGE
DML 语句,该语句是在 SQL 2003 标准修订版中添加的。

MariaDB 仅支持这些数据插入/加载语句和这些数据更新/删除语句。

您最好的选择是使用,正如@danblack建议的那样,

INSERT ... ON DUPLICATE KEY UPDATE
,这是一种MySQL/MariaDB特定的语法,可以达到相同的结果。

更新2024-09-07

当您无法在主键上进行匹配时(这是

INSERT ... ON DUPLICATE KEY UPDATE
起作用的唯一情况),那么还有另一种技术,它与
ON DUPLICATE KEY UPDATE
一样冗长,但是格式略有不同。

INSERT INTO foo (field1, field2)
SELECT 'value1', 'value2'
FROM DUAL
WHERE NOT EXISTS (
  SELECT 1
  FROM foo
  WHERE field1='value1'
    AND field2='value2'
);

这会从神奇的

DUAL
表中选择您想要插入的数据,该表始终包含您想要包含的内容。
WHERE
子句使用子
SELECT
来尝试在目标表中查找匹配的记录。

如果子

SELECT
返回一个值(因为目标记录已经存在),那么
NOT EXISTS
子句将为
FALSE
,导致
SELECT ... FROM DUAL
返回nothing,并且不会发生
INSERT
。这就是你想要的,因为目标行已经存在,因此不会插入任何内容。

如果子

SELECT
不返回任何内容(因为目标行不存在),则
NOT EXISTS
子句将为
TRUE
,导致
SELECT ... FROM DUAL
返回要被编辑的单行。这就是您想要的,因为目标行
存在,并且您现在想要插入此记录。

© www.soinside.com 2019 - 2024. All rights reserved.