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
命令中省略这些列,除非它是列的默认值。
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 来完成它。
我有 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
命令中省略这些列,除非它是列的默认值。
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 来完成它。