2011-12-02 63 views
2

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

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

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

回答

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

用一条简单的SQL语句就无法做到这一点。

但是,您可以使用每个列的一个语句。

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

,或者,如果你想空出也有空白的项目:

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

感谢您的基本语法。我希望有一种方法可以避免为每一列做这件事。 – hafichuk

1

我不认为这是可能的范围内MySQL,但肯定与您所选择的的脚本语言。

  1. 开始通过让所有表SHOW TABLES
  2. 然后为每个表得到不同的列,并找出女巫都允许null,则与DESC TABLESHOW CREATE TABLESELECT * FROM information_schema.COLUMNS,取一个你,而分析
  3. 那么对于每个允许null的列运行正常的更新,将“”更改为“null”。

准备花一些时间等待:)

相关问题