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

时间:2011-12-02 20:29:43

标签: mysql stored-procedures information-schema

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

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

我查看了information_schema.COLUMNS表并认为这可能是开始的地方。

3 个答案:

答案 0 :(得分:5)

使用一个简单的SQL语句无法做到这一点。

但是你可以使用每列的一个语句来完成它。

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

或者,如果你想要删除也有空格的项目:

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

答案 1 :(得分:1)

我认为这不可能在MySQL中使用,但肯定会使用您选择的脚本语言。

  1. 首先获取所有表格SHOW TABLES
  2. 然后,对于每个表,获取不同的列,并找出允许使用DESC TABLESHOW CREATE TABLESELECT * FROM information_schema.COLUMNS的null,使用您要解析的那个
  3. 然后,对于每个允许null运行的列,运行一个将“”更改为null的正常更新。
  4. 准备等待一段时间:)

答案 2 :(得分:0)

我想出了如何使用存储过程执行此操作。我肯定会考虑下次使用脚本语言。

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();