提问者:小点点

没有提供所有字段的MySQL替换


我有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

获得错误附近的值的错误数目

我想批量替换许多记录,但我不想查询之前的所有字段。 在本例中,我希望更新某些记录的category_id,但不是所有记录的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

这样做是真的吗? 替换一个查询中一条记录的某些字段,替换另一条记录的其他字段。

或者提供特殊变量,即某些字段将与replace(category_id)之前相同,这是真的吗?

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

共2个答案

匿名用户

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

根据文件:

任何缺少的列都将设置为其默认值。 [...] 不能引用当前行中的值并在新行中使用它们。

改用标准的update命令可能更好,它可以引用当前列值。

匿名用户

我是否也可以这样做,但不能提供所有需要的值? 示例:

替换为product_core(id,title,description,category_id)值(2,'New_Title','New_Description')#无category_id

是,正确的查询是:

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

这样做是真的吗? 替换一个查询中一条记录的某些字段,替换另一条记录的其他字段。

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

或者提供特殊变量,即某些字段将与replace(category_id)之前相同,这是真的吗?

这也许是可能的,但不是直接的,也不是在所有的MySQL版本中。 在文档中,他们说:“您不能引用当前行中的值并在新行中使用它们”。 在MySQL>中; 8.0.19值(ROW)可能会有所帮助。 或者,您也可以编写自己的UDF来执行此操作。