2011-12-02 4 views
2

データベースのクリーンアップを実行していて、空の文字列とNULL値の両方がさまざまな列に含まれている列が多数あることに気がつきました。空の文字列をデータベース全体に対してNULLに更新する

NULLを許可しないものを除いて、データベース内の各テーブルの各列の空の文字列をNULLに更新するSQL文を書くことはできますか?

私は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文ではこれを行うことはできません。

ただし、各列に対して1つのステートメントを使用して実行できます。

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

か、あなたはまた、空白を持つアイテムをゼロにしたい場合は:

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

基本的な構文をありがとう。私は、すべての列でこれを避ける方法があることを願っていました。 – hafichuk

1

私はそれがMySQLの中に確かにあなたの好みのスクリプト言語では可能だとは思いません。すべてのテーブル

  • そして、各テーブルの異なる列を取得し、魔女のものは、どちらかDESC TABLESHOW CREATE TABLEまたはSELECT * FROM information_schema.COLUMNSで、あなたはかなりのために次に
  • を解析する1を取り、ヌル許可見つけるSHOW TABLESに取得することで

    1. スタートヌルがヌルに変わる通常のアップデートを実行できるようにする各カラム。

  • は、私は、ストアドプロシージャを使用してこれを行う方法を考え出し

    関連する問題