MySQL 在未提供所有字段的情况下进行替换

MySQL REPLACE without all fields provided

我有 mysql 查询来替换一些记录:

REPLACE INTO product_core
(id, title, description, category_id)
VALUES (2, 'new_title', 'new_description', 33)

我可以做同样的事情,但不提供所有需要的值吗?示例:

REPLACE INTO product_core
(id, title, description, category_id)
VALUES (2, 'new_title', 'new_description') #no category_id

得到了error wrong number of values here near

我想批量替换多条记录,但又不想查询之前的所有字段。在此示例中,我想更新某些记录的 category_id,但不是所有记录。

REPLACE INTO product_core
(id, title, description, category_id)
VALUES (2, 'new_title_2', 'new_description_2'), #no category_id
(3, 'new_title_3', 'new_description_3', 34) #with category_id

这是真的吗?在一个查询中替换一条记录的某些字段和第二条记录的其他字段。

或者是否真的提供特殊变量意味着某些字段将与替换之前相同(category_id)?

VALUES (2, 'new_title_2', 'new_description_2', @category_id_same_as_before)

您不能从 REPLACE 命令中省略这些列,除非它是列的默认值。

根据the documentation

Any missing columns are set to their default values. [...] You cannot refer to values from the current row and use them in the new row.

最好改用标准 UPDATE 命令,它 可以 引用当前列值。

Can I do the same, but not providing all needed values? Example:

REPLACE INTO product_core (id, title, description, category_id) VALUES (2, 'new_title', 'new_description') #no category_id

是的,正确的查询是:

REPLACE INTO product_core
(id, title, description)
VALUES (2, 'new_title', 'new_description') #no category_id

编辑:正如汤姆在下面评论的那样,上面的内容可能会产生误导,因为将使用省略的列默认值,而不是为被替换的记录设置的值。

Is it real to do this? Replace some fields for one record and other fields for second record in one query.

在 MySQL 中不可能。列列表对于所有值集都是通用的。

Or if is it real to provide special variable meaning that some fields will be the same as before replace (category_id)?

这也许是可能的,但不是直截了当的,而且并非在所有 MySQL 版本中。在 docs 他们说:"You cannot refer to values from the current row and use them in the new row"。 在 MySQL > 8.0.19 中,也许 VALUES(ROW) 可以提供帮助。或者你也许可以编写你自己的 UDF 来完成它。