2010-07-04 30 views
16

vorrei aggiornare tutti i campi NULL in una tabella a 0. Naturalmenteaggiornare tutti i campi NULL MySQL

UPDATE mytable SET firstcol=0 WHERE firstcol IS NULL 

avrebbe fatto il lavoro. Ma mi chiedo se c'è una soluzione più intelligente di solo c & p questa linea per ogni colonna.

+1

Per curiosità quante colonne si dispone che è necessario passare da zero a 0 o w/e ehhe :) – Prix

+0

E ' È solo curiosità. In questo caso particolare, non avrei bisogno di nulla perché sono solo 5 o 6 colonne. Ma altre tabelle con cui lavoro hanno facilmente ottenuto 60 colonne. Ecco perché mi piacerebbe sapere come farlo anche in questo scenario. –

risposta

6

può solo ALTER colonne a NOT NULL DEFAULT 0?

Si può fare questo in una singola istruzione, come da MySQL documentation:

è possibile emettere ADD multipla, modificare, eliminare e clausole cambiamento in una singola istruzione ALTER TABLE, separati da virgole. Questa è un'estensione MySQL per SQL standard, che consente solo una delle clausole per ogni istruzione ALTER TABLE.

+0

Hmm, la tabella viene creata con una tabella create mytable AS SELECT ... che contiene casi. In qualche modo non ero in grado di impostare i valori predefiniti lì. Ecco perché ho finito con i valori NULL. Se modifico il tavolo dovrei farlo per ogni colonna separatamente, che è esattamente quello che sto cercando di prevenire. –

+0

@ ran2: non in MySQL non - modificato per riflettere questo. – Piskvor

+0

thx, ovviamente non sapevo questo fatto. Tuttavia, mi chiedo se devo elencare tutte le colonne in una simile istruzione ALTER. Voglio solo farlo per l'intero tavolo, perché se avessi 60 colonne, sarebbe brutto elencarle tutte, non importa se in uno o più statement. –

2

Non senza tecnologia intermedia o cursore. È possibile utilizzare DESCRIBE mytable; per ottenere i nomi delle colonne e scorrere su di esse per creare le query UPDATE.

Quindi è possibile. Ma per il momento in cui ti ci è voluto scrivere, probabilmente potresti semplicemente copiare e incollare;)

+0

Devo ammettere, o non ho le risposte o ho appena postato male. Tuttavia, quello che Jason dice era quello che sentivo. Mi chiedo solo se esiste una soluzione ma un ciclo. Non avevo proprio bisogno di loop in SQL finora e quindi non ho esperienza :) –

+0

IMO, questa è una cosa banale. Esegui semplicemente le tue dichiarazioni con copia e incolla. Sono d'accordo con gli altri però. Se hai iniziato da zero, potresti aver aggiunto un 'DEFAULT 0' alle tue colonne. –

5

È possibile modificare le colonne in NOT NULL.

ALTER TABLE your_table MODIFY COLUMN your_field INT NOT NULL; 

Test case:

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

Risultato:

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 potrebbe voler farlo a lungo termine, ma questo non dovrebbe aggiornare le righe già esistenti. Almeno, spero che non aggiorni le righe che già esistono. –

+0

@Brian: Fa :) ... (penso che se non si esegue in modalità rigorosa.) –

+0

Sì, questo funziona. Nota che potresti ricevere l'avvertenza "DATA TRUNCATED" piuttosto generica, ma nulla è stato davvero troncato - è solo uno di quei [messaggi di errore leggermente fuorvianti] (http://dev.mysql.com/doc/refman/5.1/en /faqs-cjk.html#qandaitem-24-11-1-1). – Mike

0

Non credo ci sia; qualsiasi istruzione che ha funzionato su righe che non soddisfacevano la clausola where aggiornava le righe che non si desidera aggiornare. La risposta di Jason è corretta, ma, penso, un po 'pericolosa, a meno che tu non sia davvero sicuro che sia quello che vuoi.

14

Si potrebbe fare questo - ripetere se necessario per ogni colonna:

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

Esempio:

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

Se si desidera modificare la struttura della tabella modificando colonne in modo che non accettino più i null, è possibile farlo con una stored procedure. La seguente procedura memorizzata interroga lo INFORMATION_SCHEMA COLUMNS per informazioni sulle colonne in una determinata tabella di database. Da quelle informazioni, costruisce una dichiarazione preparata che viene poi utilizzata per modificare la struttura della tabella.Potrebbe essere necessario modificare in base alle proprie specifiche esigenze - in questo momento, sembra per INT colonne che non hanno 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 ; 

Esempio:

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 seguente riga visualizza il comando cioè da eseguire, e possono essere rimossi dalla procedura memorizzata se necessario:

SELECT @alter_cmd; 
+0

ho usato solo 'UPDATE test SET userID = IFNULL (userId, 1);' e ha funzionato –

0

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

esegue le seguenti operazioni

  1. aggiunge una nuova colonna Columnx dopo colonnaY.
  2. imposta il suo valore di default 1 in tutta la colonna Columnx

  columnY    columnX 

     | cellValueA  |  1  |   
     | cellValueB  |  1  | 
     | cellValueC  |  1  | 
     | cellValueD  |  1  | 
Problemi correlati