2010-07-04 2 views
16

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

UPDATE mytable SET firstcol=0 WHERE firstcol IS NULL 

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

+1

Из любопытства, сколько столбцов у вас есть, что вам нужно перейти от нулевой до 0 или ж/д ehhe :) – Prix

+0

It Просто любопытство. В этом конкретном случае мне ничего не понадобится, потому что это всего 5 или 6 колос. Но другие таблицы, с которыми я работаю, легко получают 60 столбцов. Вот почему я хотел бы знать, как это сделать в таком сценарии. –

ответ

6

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

Вы можете сделать это в одном заявлении, в соответствии с MySQL documentation:

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

+0

Хм, таблица создана с помощью команды create table mytable AS SELECT ..., которая содержит случаи. Как-то я не смог установить значения по умолчанию там. Вот почему я закончил с значениями NULL. Если я изменю эту таблицу, я должен сделать это для каждого столбца отдельно, что именно то, что я пытаюсь предотвратить. –

+0

@ ran2: Не в MySQL вы не редактируете, чтобы отразить это. – Piskvor

+0

thx, очевидно, я не знал об этом факте. Тем не менее, мне интересно, нужно ли мне перечислять все столбцы в таком выражении ALTER. Я просто хочу сделать это для всей таблицы, потому что, если бы у меня было 60 столбцов, было бы уродливо перечислить их все - независимо от того, в одном или нескольких операторах. –

2

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

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

+0

Должен признаться, либо я не получу ответов, либо просто написал плохо. Однако, что Джейсон говорит, это то, что я чувствовал. Мне просто интересно, есть ли решение, но цикл. Мне просто не нужны циклы в SQL до сих пор и, таким образом, не имеют опыта :) –

+0

ИМО, это тривиальная вещь. Просто запустите свои заявления путем копирования и вставки. Однако я согласен с другими. Если вы начали с нуля, вы могли бы добавить «DEFAULT 0» в свои столбцы. –

5

Возможно, вы захотите изменить свои столбцы на 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) 
+0

ran2 может захотеть сделать это в конечном итоге, но это не должно обновлять уже существующие строки. По крайней мере, я надеюсь, что он не обновляет уже существующие строки. –

+0

@Brian: Он делает :) ... (думаю, если не работает в строгом режиме.) –

+0

Да, это работает. Обратите внимание, что вы можете получить довольно общее предупреждение «DATA TRUNCATED», но ничто действительно не было усечено - это всего лишь одно из этих [слегка вводимых в заблуждение сообщений об ошибках] (http://dev.mysql.com/doc/refman/5.1/en /faqs-cjk.html#qandaitem-24-11-1-1). – Mike

0

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

14

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

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 | 
+----+------+------+ 

UPDATE

Если вы хотите изменить структуру таблицы путем изменения столбцов так что они больше не принимают нули, вы можете сделать это с помощью хранимой процедуры. Следующая хранимая процедура запрашивает INFORMATION_SCHEMA COLUMNS для получения информации о столбцах в данной таблице базы данных. Из этой информации он создает подготовленный оператор, который затем используется для изменения структуры таблицы.Вы, возможно, потребуется настроить его в соответствии с Вашим требованиям - на данный момент, это выглядит для INT колонн, которые не имеют NOT NULL набор:

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; 
+0

Я использовал только 'UPDATE test SET userID = IFNULL (userId, 1);' и он работал –

0

ALTER TABLE dataBaseName. tableName ADD COLUMN columnX INT (20) NULL DEFAULT 1 ПОСЛЕ columnY;

Он делает следующее

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

  columnY    columnX 

     | cellValueA  |  1  |   
     | cellValueB  |  1  | 
     | cellValueC  |  1  | 
     | cellValueD  |  1  | 
Смежные вопросы