2010-07-04 19 views
16

me gustaría actualizar todos los campos NULL en una tabla a 0. Por supuestoactualizar todos los campos NULL MySQL

UPDATE mytable SET firstcol=0 WHERE firstcol IS NULL 

haría el trabajo. Pero me pregunto si hay una solución más inteligente que simplemente c & p esta línea para cada columna.

+1

Por curiosidad el número de columnas que tiene que tiene que cambiar de NULL a 0 ó w/e ehhe :) Se – Prix

+0

Es solo curiosidad. En este caso particular, no necesitaría nada porque son solo 5 o 6 cols. Pero otras tablas con las que trabajo fácilmente tienen 60 columnas. Por eso también me gustaría saber cómo hacerlo en ese escenario. –

Respuesta

6

puede usted apenas ALTER las columnas a NOT NULL DEFAULT 0?

Usted puede hacer esto en una sola instrucción, según MySQL documentation:

puede emitir agregar múltiples, alterar, borrar, y las cláusulas de cambio en una sola sentencia ALTER TABLE, separados por comas. Esta es una extensión de MySQL para SQL estándar, que permite solo una de cada cláusula por sentencia ALTER TABLE.

+0

Hmm, la tabla se crea con una tabla create mytable AS SELECT ... que contiene casos. De alguna manera, no pude establecer valores predeterminados allí. Es por eso que terminé con los valores NULL. Si modifico esa tabla tendré que hacerlo por cada columna por separado, que es exactamente lo que estoy tratando de prevenir. –

+0

@ ran2: No está en MySQL, no está editado para reflejar esto. – Piskvor

+0

thx, obviamente no sabía acerca de este hecho. Aún así, me pregunto si tengo que listar todas las columnas en dicha declaración ALTER. Solo quiero hacerlo para toda la tabla, porque si tuviera 60 columnas, sería feo enumerarlas todas, no importa si se trata de una o varias afirmaciones. –

2
No

sin una tecnología intermedia o el cursor. Puede usar DESCRIBE mytable; para obtener los nombres de las columnas y recorrerlos para crear sus consultas UPDATE.

lo que es posible. Pero cuando te tomó escribir eso, probablemente podrías haber copiado y pegado;)

+0

Debo admitir que o no recibo las respuestas o simplemente las publico mal. Sin embargo, lo que Jason dice fue lo que sentí. Me pregunto si hay una solución, sino un bucle. Simplemente no necesitaba bucles en SQL hasta el momento y por lo tanto no tengo experiencia :) –

+0

IMO, esto es algo trivial. Simplemente ejecute sus declaraciones copiando y pegando. Sin embargo, estoy de acuerdo con los demás. Si comenzó desde cero, podría haber agregado un 'DEFAULT 0' a sus columnas. –

5

Es posible que quieras alterar tus columnas al NOT NULL.

ALTER TABLE your_table MODIFY COLUMN your_field INT NOT NULL; 

caso de prueba:

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); 

Resultado:

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 puede querer hacer eso en el largo plazo, pero eso no debería actualizar las filas que ya existen. Al menos, espero que no actualice las filas que ya existen. –

+0

@Brian: Sí :) ... (Creo que a menos que se ejecute en modo estricto) –

+0

Sí, esto funciona. Tenga en cuenta que puede recibir la advertencia bastante genérica 'TRUNCADO DE DATOS', pero nada se ha truncado realmente: es solo uno de esos [mensajes de error ligeramente engañosos] (http://dev.mysql.com/doc/refman/5.1/en /faqs-cjk.html#qandaitem-24-11-1-1). – Mike

0

no creo que hay; cualquier instrucción que funcionara en filas que no satisfacían la cláusula where actualizaría las filas que no intentó actualizar. La respuesta de Jason es correcta, pero, creo, un poco insegura, a menos que estés realmente seguro de que eso es lo que quieres.

14

Usted puede hacer esto - repetir según sea necesario para cada columna:

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

Ejemplo:

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

ACTUALIZACIÓN

Si desea alterar la estructura de la tabla cambiando columnas para que ya no acepten nulos, puedes hacerlo con un procedimiento almacenado. El siguiente procedimiento almacenado consulta el INFORMATION_SCHEMA COLUMNS para obtener información sobre las columnas en una tabla de base de datos determinada. A partir de esa información, crea una declaración preparada que luego se utiliza para modificar la estructura de la tabla.Es posible que tenga que ajustar para adaptarse a sus necesidades exactas - por el momento, se busca INT columnas que no tienen NOT NULL conjunto:

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 ; 

Ejemplo:

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 

La siguiente línea muestra el comando que ha de ser ejecutado, y puede ser retirado del procedimiento almacenado si es necesario:

SELECT @alter_cmd; 
+0

utilicé simplemente 'UPDATE test SET userID = IFNULL (userId, 1);' y funcionó –

0

ALTER TABLA. tableName ADD COLUMN columnX INT (20) PREDETERMINADO NULO 1 DESPUÉS columnY;

realiza las siguientes acciones

  1. añade una nueva columna Columnx después columnY.
  2. establece su valor por defecto 1 a lo largo de la columna Columnx

  columnY    columnX 

     | cellValueA  |  1  |   
     | cellValueB  |  1  | 
     | cellValueC  |  1  | 
     | cellValueD  |  1  | 
Cuestiones relacionadas