データベースのクリーンアップを実行していて、空の文字列とNULL値の両方がさまざまな列に含まれている列が多数あることに気がつきました。空の文字列をデータベース全体に対してNULLに更新する
NULLを許可しないものを除いて、データベース内の各テーブルの各列の空の文字列をNULLに更新するSQL文を書くことはできますか?
私はinformation_schema.COLUMNS
テーブルを見て、これが開始する場所かもしれないと思います。
データベースのクリーンアップを実行していて、空の文字列とNULL値の両方がさまざまな列に含まれている列が多数あることに気がつきました。空の文字列をデータベース全体に対してNULLに更新する
NULLを許可しないものを除いて、データベース内の各テーブルの各列の空の文字列をNULLに更新するSQL文を書くことはできますか?
私は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文ではこれを行うことはできません。
ただし、各列に対して1つのステートメントを使用して実行できます。
UPDATE TABLE SET COLUMN = NULL
WHERE LENGTH(COLUMN) = 0
か、あなたはまた、空白を持つアイテムをゼロにしたい場合は:
UPDATE TABLE SET COLUMN = NULL
WHERE LENGTH(TRIM(COLUMN)) = 0
私はそれがMySQLの中に確かにあなたの好みのスクリプト言語では可能だとは思いません。すべてのテーブル
DESC TABLE
、SHOW CREATE TABLE
またはSELECT * FROM information_schema.COLUMNS
で、あなたはかなりのために次にSHOW TABLES
に取得することで
基本的な構文をありがとう。私は、すべての列でこれを避ける方法があることを願っていました。 – hafichuk