2

データベースのクリーンアップを実行していますが、さまざまな列に空の文字列とNULL値の両方がある列がたくさんあることに気付きました。

NULLを許可しないものを除いて、データベース内の各テーブルの各列の空の文字列をNULLに更新するSQLステートメントを作成することは可能ですか?

私はinformation_schema.COLUMNSテーブルを見て、ここから始めるかもしれないと思います。

4

3 に答える 3

5

1つの単純なSQLステートメントでこれを行うことはできません。

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

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

または、空白もあるアイテムを無効にする場合は、次のようにします。

UPDATE TABLE SET COLUMN = NULL
WHERE LENGTH(TRIM(COLUMN)) = 0
于 2011-12-02T20:36:16.003 に答える
1

MySQL内では可能ではないと思いますが、選択したスクリプト言語では確かに可能です。

  1. すべてのテーブルを取得することから始めますSHOW TABLES
  2. 次に、テーブルごとに異なる列を取得し、ウィッチのものがnullを許可することを確認します。、、またはのいずれかを使用してDESC TABLESHOW CREATE TABLE解析SELECT * FROM information_schema.COLUMNSする 列を取得します。
  3. 次に、nullを許可する列ごとに、「」をnullに変更する通常の更新を実行します。

しばらく待つ準備をしてください:)

于 2011-12-02T20:36:53.200 に答える
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();
于 2011-12-02T22:41:33.660 に答える