web-dev-qa-db-ja.com

すべてのNULLフィールドを更新するMySQL

1つのテーブルのすべてのNULLフィールドを0に更新したいのですが。もちろん

UPDATE mytable SET firstcol=0 WHERE firstcol IS NULL 

その仕事をするだろう。しかし、すべての列に対してこの行をc&pするよりも賢い解決策があるのではないかと思います。

17
Matt Bannert

列をALTERしてNOT NULL DEFAULT 0

MySQLドキュメント のように、これを1つのステートメントで実行できます。

単一のALTERTABLEステートメントで、コンマで区切って、複数のADD、ALTER、DROP、およびCHANGE句を発行できます。これは、標準SQLに対するMySQLの拡張機能であり、ALTERTABLEステートメントごとに各句を1つだけ許可します。

これを行うことができます-各列に対して必要に応じて繰り返します:

UPDATE `table1`  SET
    `col1` = IFNULL(col1, 0),
    `col2` = IFNULL(col2, 0);

例:

DROP TABLE IF EXISTS `table1`;

CREATE TABLE `table1` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `col1` int(10) unsigned,
  `col2` int(10) unsigned,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB;

INSERT INTO `table1` VALUES
(1,    1, NULL),
(2, NULL, NULL),
(3,    2, NULL),
(4, NULL, NULL),
(5,    3,    4),
(6,    5,    6),
(7,    7, NULL);

UPDATE `table1`  SET
    `col1` = IFNULL(col1, 0),
    `col2` = IFNULL(col2, 0);

SELECT * FROM `table1`;

+----+------+------+
| id | col1 | col2 |
+----+------+------+
|  1 |    1 |    0 |
|  2 |    0 |    0 |
|  3 |    2 |    0 |
|  4 |    0 |    0 |
|  5 |    3 |    4 |
|  6 |    5 |    6 |
|  7 |    7 |    0 |
+----+------+------+

[〜#〜]更新[〜#〜]

Nullを受け入れないように列を変更してテーブル構造を変更する場合は、ストアドプロシージャを使用して行うことができます。次のストアドプロシージャは、特定のデータベーステーブルの列に関する情報について INFORMATION_SCHEMA COLUMNS をクエリします。その情報から、プリペアドステートメントを作成し、それを使用してテーブル構造を変更します。正確な要件に合わせて微調整する必要がある場合があります。現時点では、NOT NULLが設定されていないINT列を検索します。

delimiter //
DROP PROCEDURE IF EXISTS no_nulls//
CREATE PROCEDURE `no_nulls` (IN param_schema CHAR(255), IN param_table CHAR(255))
BEGIN

    SET @alter_cmd = (SELECT CONCAT(
        'ALTER TABLE ',
        param_table,
        GROUP_CONCAT(
            ' MODIFY COLUMN ',
            `column_name`, ' ',
            `column_type`,
            ' NOT NULL'
            SEPARATOR ', ')
        ) AS `sql_cmd`
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE `table_schema` = param_schema
    AND `table_name` = param_table
    AND LCASE(`data_type`) = 'int'
    AND LCASE(`is_nullable`) = 'yes');

    IF NOT ISNULL(@alter_cmd) THEN
        SELECT @alter_cmd;
        PREPARE stmt FROM @alter_cmd;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
    END IF;

END//
delimiter ;

例:

CREATE TABLE `test`.`table1` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `col1` int(10) unsigned,
  `col2` int(10) unsigned,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB;

CALL no_nulls('test', 'table1');
    +----------------------------------------------------------------------------------------------------------------+
| @alter_cmd                                                                                                     |
+----------------------------------------------------------------------------------------------------------------+
| ALTER TABLE table1 MODIFY COLUMN col1 int(10) unsigned NOT NULL,  MODIFY COLUMN col2 int(10) unsigned NOT NULL |
+----------------------------------------------------------------------------------------------------------------+

SHOW CREATE TABLE `test`.`table1`;

CREATE TABLE `table1` (
    `id` int(10) unsigned NOT NULL auto_increment,
    `col1` int(10) unsigned NOT NULL,
    `col2` int(10) unsigned NOT NULL,
    PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

次の行は、実行されるコマンドを示しており、必要に応じてストアドプロシージャから削除できます。

SELECT @alter_cmd;
14
Mike

列をNOT NULLに変更することをお勧めします。

ALTER TABLE your_table MODIFY COLUMN your_field INT NOT NULL;

テストケース:

CREATE TABLE nulltable (id INT);

INSERT INTO nulltable VALUES (1);
INSERT INTO nulltable VALUES (2);
INSERT INTO nulltable VALUES (3);
INSERT INTO nulltable VALUES (NULL);
INSERT INTO nulltable VALUES (NULL);
INSERT INTO nulltable VALUES (NULL);
INSERT INTO nulltable VALUES (5);

結果:

mysql> SELECT * FROM nulltable;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
| NULL |
| NULL |
| NULL |
|    5 |
+------+
7 rows in set (0.00 sec)

mysql> ALTER TABLE nulltable MODIFY COLUMN id INT NOT NULL;
Query OK, 7 rows affected, 3 warnings (0.08 sec)
Records: 7  Duplicates: 0  Warnings: 3

mysql> SELECT * FROM nulltable;
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
|  0 |
|  0 |
|  0 |
|  5 |
+----+
7 rows in set (0.00 sec)
5
Daniel Vassallo

中間技術やカーソルがないわけではありません。 DESCRIBE mytable;を使用して列名を取得し、それらをループしてUPDATEクエリを作成できます。

だからそれは可能です。しかし、それを書くのにかかった頃には、おそらくコピーして貼り付けることができたでしょう;)

2
Jason McCreary

これは私のために働いた!

UPDATE `results`  SET
    column1  = IFNULL(column1,0),
    column2  = IFNULL(column2,'');

これはマイクの答えですが、左側の列の引用符はありません!

注:列のデータ型がintの場合、空の文字列ではなく値「0」を設定しようとしている場合

0
harry

ALTER TABLE dataBaseName.tableName ADD COLUMN columnX INT(20)NULL DEFAULT 1 AFTER columnY;

以下を行います

  1. columnYの後に新しい列columnXを追加します。
  2. 列columnX全体でその値をデフォルト1に設定します

           columnY             columnX 

         | cellValueA     |     1       |        
         | cellValueB     |     1       |
         | cellValueC     |     1       |
         | cellValueD     |     1       |

あるとは思わない。 where句を満たさない行で機能するステートメントは、更新するつもりのない行を更新します。ジェイソンの答えは正しいですが、それがあなたが望むものであると本当に確信していない限り、私は少し危険だと思います。

0
Brian Hooper