обновить все пустые поля MySQL - PullRequest
17 голосов
/ 04 июля 2010

Я хотел бы обновить все пустые поля в одной таблице до 0. Конечно,

UPDATE mytable SET firstcol=0 WHERE firstcol IS NULL 

выполнит эту работу.Но мне интересно, есть ли более разумное решение, чем просто с & р эту строку для каждого столбца.

Ответы [ 7 ]

14 голосов
/ 04 июля 2010

Вы можете сделать это - при необходимости повторите для каждого столбца:

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 информацию о столбцах в данной таблице базы данных.На основании этой информации он создает подготовленный оператор, который затем используется для изменения структуры таблицы.Возможно, вам придется настроить его в соответствии с вашими точными требованиями - на данный момент он ищет INT столбцы, которые не имеют NOT NULL set:

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;
7 голосов
/ 04 июля 2010

Можете ли вы просто ALTER столбцы до NOT NULL DEFAULT 0?

Вы можете сделать это одним оператором согласно документации MySQL :

Вы можете использовать несколько предложений ADD, ALTER, DROP и CHANGE в одном операторе ALTER TABLE, разделенных запятыми. Это расширение MySQL к стандартному SQL, которое допускает только одно из каждого предложения на оператор ALTER TABLE.

5 голосов
/ 04 июля 2010

Вы можете изменить свои столбцы на 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)
2 голосов
/ 04 июля 2010

Не без промежуточной технологии или курсора. Вы можете использовать DESCRIBE mytable;, чтобы получить имена столбцов и циклически повторять их для построения ваших UPDATE запросов.

Так что это возможно. Но к тому времени, когда вам понадобилось написать это, вы, вероятно, просто могли скопировать и вставить;)

0 голосов
/ 24 октября 2018

Это работает для меня!

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

Это ответ Майка, но без кавычек для столбцов слева!

Примечание: Если вы пытаетесьустановите ваши значения '0' вместо пустой строки, если тип данных столбца int

0 голосов
/ 11 июля 2015

ALTER TABLE dataBaseName. tableName ДОБАВИТЬ КОЛОННУ columnX INT (20) NULL ПО УМОЛЧАНИЮ 1 ПОСЛЕ columnY;

Это делает следующее

  1. добавляет новый столбец columnX после столбца Y.
  2. устанавливает его значение по умолчанию 1 во всем столбце столбцаX

           columnY             columnX 

         | cellValueA     |     1       |        
         | cellValueB     |     1       |
         | cellValueC     |     1       |
         | cellValueD     |     1       |
0 голосов
/ 04 июля 2010

Я не верю, что есть; любой оператор, который работал со строками, не удовлетворяющими условию where, обновлял строки, которые вы не собирались обновлять. Ответ Джейсона верен, но, думаю, немного небезопасен, если только вы не уверены, что именно этого хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...