1つのテーブルのすべてのNULLフィールドを0に更新したいのですが。もちろん
UPDATE mytable SET firstcol=0 WHERE firstcol IS NULL
その仕事をするだろう。しかし、すべての列に対してこの行をc&pするよりも賢い解決策があるのではないかと思います。
列を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;
列を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)
中間技術やカーソルがないわけではありません。 DESCRIBE mytable;
を使用して列名を取得し、それらをループしてUPDATE
クエリを作成できます。
だからそれは可能です。しかし、それを書くのにかかった頃には、おそらくコピーして貼り付けることができたでしょう;)
これは私のために働いた!
UPDATE `results` SET
column1 = IFNULL(column1,0),
column2 = IFNULL(column2,'');
これはマイクの答えですが、左側の列の引用符はありません!
注:列のデータ型がintの場合、空の文字列ではなく値「0」を設定しようとしている場合
ALTER TABLE dataBaseName
.tableName
ADD COLUMN columnX
INT(20)NULL DEFAULT 1 AFTER columnY
;
以下を行います
columnY columnX
| cellValueA | 1 |
| cellValueB | 1 |
| cellValueC | 1 |
| cellValueD | 1 |
あるとは思わない。 where句を満たさない行で機能するステートメントは、更新するつもりのない行を更新します。ジェイソンの答えは正しいですが、それがあなたが望むものであると本当に確信していない限り、私は少し危険だと思います。