将整个数据库的空字符串更新为 NULL

发布于 2024-12-19 04:35:37 字数 182 浏览 5 评论 0原文

我正在执行一些数据库清理,并注意到有很多列在各个列中同时具有空字符串和 NULL 值。

是否可以编写一条 SQL 语句来将数据库中每个表的每一列的空字符串更新为 NULL,除了不允许 NULL 的列之外?

我查看了 information_schema.COLUMNS 表并认为这可能是起点。

I'm performing some database clean up and have noticed that there are a lot of columns that have both empty strings and NULL values in various columns.

Is it possible to write an SQL statement to update the empty strings to NULL for each column of each table in my database, except for the ones that do not allow NULL's?

I've looked at the information_schema.COLUMNS table and think that this might be the place to start.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

北音执念 2024-12-26 04:35:37

使用一条简单的 SQL 语句不可能做到这一点。

但您可以对每一列使用一个语句来完成此操作。

UPDATE TABLE SET COLUMN = NULL
WHERE LENGTH(COLUMN) = 0

或者,如果您想清空也有空格的项目:

UPDATE TABLE SET COLUMN = NULL
WHERE LENGTH(TRIM(COLUMN)) = 0

It's not possible to do this with one simple SQL statement.

But you can do it using one statement for each column.

UPDATE TABLE SET COLUMN = NULL
WHERE LENGTH(COLUMN) = 0

or, if you want to null out the items that also have whitespace:

UPDATE TABLE SET COLUMN = NULL
WHERE LENGTH(TRIM(COLUMN)) = 0
尴尬癌患者 2024-12-26 04:35:37

我认为这在 MySQL 中是不可能的,但使用您选择的脚本语言当然是可能的。

  1. 首先获取所有表 SHOW TABLES
  2. 然后对于每个表获取不同的列并找出允许 null 的表,可以使用 DESC TABLESHOW CREATE TABLE 或 SELECT * FROM information_schema.COLUMNS,选择您更愿意解析的那个
  3. 然后对于允许 null 的每一列运行正常更新,将“”更改为 null。

准备花一些时间等待:)

I don't think it's possible within MySQL but certainly with a script language of your choice.

  1. Start by getting all tables SHOW TABLES
  2. Then for each table get the different columns and find out witch ones allow null, either with DESC TABLE, SHOW CREATE TABLE or SELECT * FROM information_schema.COLUMNS, take the one you rather parse
  3. Then for each column that allows null run a normal update that changes "" to null.

Prepare to spend some time waiting :)

貪欢 2024-12-26 04:35:37

我想出了如何使用存储过程来做到这一点。下次我肯定会考虑使用脚本语言。

DROP PROCEDURE IF EXISTS settonull;

DELIMITER //

CREATE PROCEDURE settonull()
BEGIN
  DECLARE done INT DEFAULT FALSE;
  DECLARE _tablename VARCHAR(255);
  DECLARE _columnname VARCHAR(255);
  DECLARE cur1 CURSOR FOR SELECT 
                           CONCAT(TABLE_SCHEMA, '.', TABLE_NAME) AS table_name,
                           COLUMN_NAME AS column_name 
                           FROM information_schema.COLUMNS 
                           WHERE IS_NULLABLE = 'YES' 
                           AND TABLE_SCHEMA IN ('table1', 'table2', 'table3');

  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

  OPEN cur1;

  read_loop: LOOP
    FETCH cur1 INTO _tablename, _columnname;

    IF done THEN
      LEAVE read_loop;
    END IF;

    SET @s = CONCAT('UPDATE ', _tablename, ' SET ', _columnname, ' = NULL WHERE LENGTH(TRIM(', _columnname, ')) = 0' );
    PREPARE stmt FROM @s;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;

  END LOOP;

  CLOSE cur1;
END//

DELIMITER ;

CALL settonull();

I figured out how to do this using a stored procedure. I'd definitely look at using a scripting language next time.

DROP PROCEDURE IF EXISTS settonull;

DELIMITER //

CREATE PROCEDURE settonull()
BEGIN
  DECLARE done INT DEFAULT FALSE;
  DECLARE _tablename VARCHAR(255);
  DECLARE _columnname VARCHAR(255);
  DECLARE cur1 CURSOR FOR SELECT 
                           CONCAT(TABLE_SCHEMA, '.', TABLE_NAME) AS table_name,
                           COLUMN_NAME AS column_name 
                           FROM information_schema.COLUMNS 
                           WHERE IS_NULLABLE = 'YES' 
                           AND TABLE_SCHEMA IN ('table1', 'table2', 'table3');

  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

  OPEN cur1;

  read_loop: LOOP
    FETCH cur1 INTO _tablename, _columnname;

    IF done THEN
      LEAVE read_loop;
    END IF;

    SET @s = CONCAT('UPDATE ', _tablename, ' SET ', _columnname, ' = NULL WHERE LENGTH(TRIM(', _columnname, ')) = 0' );
    PREPARE stmt FROM @s;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;

  END LOOP;

  CLOSE cur1;
END//

DELIMITER ;

CALL settonull();
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文