我正在尝试对 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 相关。
在撰写本文时,MariaDB 不支持
MERGE
DML 语句,该语句是在 SQL 2003 标准修订版中添加的。
MariaDB 仅支持这些数据插入/加载语句和这些数据更新/删除语句。
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
返回要被编辑的单行。这就是您想要的,因为目标行不存在,并且您现在想要插入此记录。