我正在执行一些数据库清理,并且注意到有很多列在各个列中都有空字符串和NULL值。将整个数据库的空字符串更新为NULL
是否有可能编写一条SQL语句,将数据库中每个表的每个列的空字符串更新为NULL,除了那些不允许NULL的列?
我看了information_schema.COLUMNS
表,并认为这可能是开始的地方。
我正在执行一些数据库清理,并且注意到有很多列在各个列中都有空字符串和NULL值。将整个数据库的空字符串更新为NULL
是否有可能编写一条SQL语句,将数据库中每个表的每个列的空字符串更新为NULL,除了那些不允许NULL的列?
我看了information_schema.COLUMNS
表,并认为这可能是开始的地方。
我想出如何使用存储过程来做到这一点。下次我肯定会考虑使用脚本语言。
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();
用一条简单的SQL语句就无法做到这一点。
但是,您可以使用每个列的一个语句。
UPDATE TABLE SET COLUMN = NULL
WHERE LENGTH(COLUMN) = 0
,或者,如果你想空出也有空白的项目:
UPDATE TABLE SET COLUMN = NULL
WHERE LENGTH(TRIM(COLUMN)) = 0
我不认为这是可能的范围内MySQL,但肯定与您所选择的的脚本语言。
SHOW TABLES
DESC TABLE
,SHOW CREATE TABLE
或SELECT * FROM information_schema.COLUMNS
,取一个你,而分析准备花一些时间等待:)
感谢您的基本语法。我希望有一种方法可以避免为每一列做这件事。 – hafichuk