【问题标题】:Can I set multiple columns to NULL in MySQL in bulk?我可以在 MySQL 中将多个列批量设置为 NULL 吗?
【发布时间】:2020-01-15 11:51:54
【问题描述】:

我有一个非常大的数据库,为了进行测试,我想将一定数量的数据设置为 NULL。

例如,我在 3 个表中有 57 列,所有这些都需要被取消。我无法删除这些行,我只需要知道如果该行存在并且这些字段中没有数据,那么一切仍然有效。

为了澄清,这些字段中的所有数据都已移动到另一个表中,并且旧数据在迁移中没有被擦除。要测试我的报告,我需要知道报告是从新位置而不是旧位置提取的,因为添加新数据时,它只会转到新位置。我们的计划是从旧数据库生成每个报告,迁移,然后再次生成它们并进行比较。但为了确保它们从正确的位置提取,我们希望擦除旧数据,以免它提供误报。

有没有办法让我批量执行此操作,或者我应该放弃自己编写一个又一个逗号分隔的 SET 语句?

【问题讨论】:

  • 我不明白...您是否希望每个表的每个字段都为空,或者将保存一个预先确定的集合(例如 ID)?或者,也许您是在问如何在不指定字段名称的情况下进行更新(听起来像“将 null 设置为不是这一列的每一列”)?
  • 有一个预定的集合将被保存(其中的ID),所以“除XY&Z之外的每一列”都会很棒,就像“将所有这些()设置为null”而不是“设置这个一个为空,这个为空,这个为空”
  • 我们在说多少列需要设置为NULL?
  • 最大的表有 37 个,一个有 29 个,一个有 22 个,一个有 9 个(这是我必须保留一些数据的地方,我不能只是截断并重新创建行),和 8 表有 1 到 3 之间
  • 那么关于编写 12 条 UPDATE 语句,总共有 100 列,你想设置为 NULL 的问题是什么?

标签: mysql null sql-update bulkupdate


【解决方案1】:

您可以使用内部information_schema.COLUMNS 表中的数据创建语句。

假设你有这张桌子:

CREATE TABLE my_table (
  keep1 INT,
  keep2 INT,
  set_null1 INT,
  set_null2 INT,
  set_null3 INT
);

并且您想将除keep1keep2 之外的所有列设置为NULL。执行以下脚本:

set @db_name = 'test';
set @table_name = 'my_table';
set @exclude_columns = 'keep1,keep2';

select concat(
  'UPDATE `', @table_name, '` SET\n',
  group_concat('`', COLUMN_NAME, '` = NULL' separator ',\n'),
  ';'
)
from information_schema.COLUMNS c
where c.TABLE_SCHEMA = @db_name
  and c.TABLE_NAME   = @table_name
  and find_in_set(c.COLUMN_NAME, @exclude_columns) = 0;

这将生成以下语句:

UPDATE `my_table` SET
`set_null1` = NULL,
`set_null2` = NULL,
`set_null3` = NULL;

复制结果并将其粘贴到您的 UPDATE 脚本中。对调整变量 @db_name@table_name@exclude_columns 的所有 12 个表执行此操作。

db-fiddle 上查看演示。

【讨论】:

    【解决方案2】:

    这对于 SQL 数据库来说是一项非常不寻常的任务,因此有点尴尬也就不足为奇了。

    如您所知,要在 UPDATE 语句中将多个列设置为 NULL,您必须单独设置每个列。

    UPDATE mytable
    SET col1 = NULL, col2 = NULL, ... col57 = NULL
    WHERE id = ?;
    

    这可能是相当多的打字。或者,编写代码循环遍历表中的列名并连接 UPDATE 语句的术语可能是一项任务。由你决定。

    另一种可能更容易的方法是删除该行,然后重新插入它,除了主键之外不指定任何值。

    DELETE FROM mytable WHERE id = ?;
    INSERT INTO mytable SET id = ?;
    

    通过省略其他列,它们将为 NULL 或者采用在您的表中定义的 DEFAULT 值。如果您希望那些默认值也为 NULL 的列,则必须指定它。

    INSERT INTO mytable SET id = ?, col23 = NULL;
    

    【讨论】:

    • 是的,这是个好主意。在某些情况下,我希望保存的不仅仅是 id,但删除和重新创建可能更容易。如果有些表的 id 确实是我想要保存的唯一内容,我可能可以截断整个内容并插入正确数量的行。
    猜你喜欢
    • 2013-03-18
    • 2011-04-05
    • 2014-09-16
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    • 2020-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多