从所有表中的MySQL数据库中删除所有零日期

Abh*_*eet 4 mysql mysql-workbench

MySQL中有很多表,其中包含dateTime列中的零日期 0000-00-00 00:00:00

使用某种管理设置,是否可以禁用零日期并用静态值替换所有零1-1-1900

编辑:

我正在进行数据库迁移,涉及将100多个MySQL表迁移到SQL Server.

我可以通过设置数据库模式来避免在每个表上手动执行脚本吗?

fth*_*lla 8

要更改存在值,您可以使用如下查询:

UPDATE tablename SET date_column = '1900-01-01' WHERE date_column = '0000-00-00';
Run Code Online (Sandbox Code Playgroud)

如果要自动执行UPDATE查询,可以使用预准备语句:

SET @sql_update=CONCAT_WS(' ', 'UPDATE', CONCAT(_schema, '.', _table),
                               'SET', _column, '=', '\'1900-01-01\'',
                               'WHERE', _column, '=', '\'0000-00-00\'');

PREPARE stmt FROM @sql_update;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
Run Code Online (Sandbox Code Playgroud)

并且您可以遍历当前模式中声明为日期的所有表中的所有列:

SELECT
  table_schema,
  table_name,
  column_name
FROM
  information_schema.columns
WHERE
  table_schema=DATABASE() AND data_type LIKE 'date%'
Run Code Online (Sandbox Code Playgroud)

要遍历所有列,您可以使用存储过程:

DELIMITER //
CREATE PROCEDURE update_all_tables() BEGIN
  DECLARE done BOOLEAN DEFAULT FALSE;
  DECLARE _schema VARCHAR(255);
  DECLARE _table VARCHAR(255);
  DECLARE _column VARCHAR(255);
  DECLARE cur CURSOR FOR SELECT
                           CONCAT('`', REPLACE(table_schema, '`', '``'), '`'),
                           CONCAT('`', REPLACE(table_name, '`', '``'), '`'),
                           CONCAT('`', REPLACE(column_name, '`', '``'), '`')
                         FROM
                           information_schema.columns
                         WHERE
                           table_schema=DATABASE() AND data_type LIKE 'date%';

  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done := TRUE;

  OPEN cur;

  columnsLoop: LOOP
    FETCH cur INTO _schema, _table, _column;
    IF done THEN
      LEAVE columnsLoop;
    END IF;   

    SET @sql_update=CONCAT_WS(' ', 'UPDATE', CONCAT(_schema, '.', _table),
                                   'SET', _column, '=', '\'1900-01-01\'',
                                   'WHERE', _column, '=', '\'0000-00-00\'');

    PREPARE stmt FROM @sql_update;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;

  END LOOP columnsLoop;

  CLOSE cur;
END//
DELIMITER ;
Run Code Online (Sandbox Code Playgroud)

在这里查看示例.


0cn*_*che 6

这是一个老问题,但遇到了类似的问题,除了我试图将 0000-00-00 设置为 NULL。

正在尝试查询这个

UPDATE 表名 SET date_column = NULL WHERE date_column = '0000-00-00';

并收到以下错误:

日期值不正确:第 1 行的“date_column”列为“0000-00-00”

事实证明,以下在 0000-00-00 周围没有 '' 的查询有效!

UPDATE 表名 SET date_column = NULL WHERE date_column = 0000-00-00;