データベースのクリーンアップを実行していますが、さまざまな列に空の文字列とNULL値の両方がある列がたくさんあることに気付きました。
NULLを許可しないものを除いて、データベース内の各テーブルの各列の空の文字列をNULLに更新するSQLステートメントを作成することは可能ですか?
私はinformation_schema.COLUMNS
テーブルを見て、ここから始めるかもしれないと思います。
データベースのクリーンアップを実行していますが、さまざまな列に空の文字列とNULL値の両方がある列がたくさんあることに気付きました。
NULLを許可しないものを除いて、データベース内の各テーブルの各列の空の文字列をNULLに更新するSQLステートメントを作成することは可能ですか?
私はinformation_schema.COLUMNS
テーブルを見て、ここから始めるかもしれないと思います。
1つの単純なSQLステートメントでこれを行うことはできません。
ただし、列ごとに1つのステートメントを使用して実行できます。
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
する 列を取得します。しばらく待つ準備をしてください:)
ストアドプロシージャを使用してこれを行う方法を理解しました。次回は間違いなくスクリプト言語の使用を検討したいと思います。
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();