2010-07-04 7 views
16

ben iş yapacağını elbettegüncelleme bütün NULL alanlar MySQL

UPDATE mytable SET firstcol=0 WHERE firstcol IS NULL 

Of 0'a bir tablodaki tüm BOŞ alanları güncellemek istiyorum. Ama merak ediyorum ki, her sütun için bu satırdan daha akıllı bir çözüm var mı? & p.

+1

sütunu boyunca 1 varsayılan değerini ayarlar w/e ehhe :) – Prix

+0

It Sadece merakım. Bu durumda, hiçbir şeye ihtiyacım yok çünkü sadece 5 veya 6 cols. Ama kolayca çalıştığım diğer tablolar 60 sütun var. Bu yüzden böyle bir senaryoda nasıl yapılacağını bilmek isterim. –

cevap

6

Can sadece ALTER sütunları?

Sen MySQL documentation başına gibi tek bir açıklamada yapabilirsiniz:

virgüllerle ayırarak tek bir ALTER TABLE deyiminde birden EKLE, ALTER DAMLA ve DEĞİŞİM maddeleri, verebilir. Bu, standart SQL'e bir MySQL uzantısıdır, bu da ALTER TABLE ifadesine göre her bir maddeden sadece birine izin verir.

+0

Hmm, tablo, durumları içeren bir create table mytable AS SELECT ... deyimiyle oluşturulur. Bir şekilde oradaki varsayılan değerleri ayarlayamadım. Bu yüzden NULL değerleri ile bitti. Eğer bu tabloyu değiştirirsem, her bir sütun için ayrı ayrı yapmak zorundayım ki bu da engellemeye çalışıyorum. –

+0

@ ran2: MySQL'de değilsiniz, bunu yansıtmak için düzenlenmez. – Piskvor

+0

thx, açıkçası bu gerçeği bilmiyordum. Yine de, böyle bir ALTER deyimindeki tüm sütunları listelemem gerekip gerekmediğini merak ediyorum. Ben sadece tüm tablo için yapmak istiyorum, çünkü 60 sütun varsa, hepsini listelemek için çirkin olurdu - bir veya birden fazla ifadede olursa olsun. –

2

Ara teknoloji veya imleç yok. DESCRIBE mytable;, sütun adlarını almak ve UPDATE sorgularınızı oluşturmak için bunların üstesinden gelmek için kullanabilirsiniz.

Bu yüzden mümkündür. Ama bunu yazman gereken zaman, muhtemelen kopyalayıp yapıştırmış olabilirsiniz;)

+0

Ya kabul etmeliyim, ya cevapları almıyorum ya da sadece kötü mesaj gönderdim. Ancak, Jason’ın söylediği şey buydu. Sadece bir çözüm olup olmadığını merak ediyorum. Şimdiye kadar SQL'de döngülere ihtiyaç duymadım ve bu yüzden hiç deneyimim yok :) –

+0

IMO, bu önemsiz bir şey. Sadece ifadelerinizi kopyalayıp yapıştırın. Yine de diğerlerine katılıyorum. Sıfırdan başladığınızda, sütunlarınıza "DEFAULT 0" eklenmiş olabilirsiniz. –

5

Sütunlarınızı NOT NULL'a değiştirmek isteyebilirsiniz.

ALTER TABLE your_table MODIFY COLUMN your_field INT NOT NULL; 

Test durumda:

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

Sonuç: NOT NULL DEFAULT 0 için

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 bunu uzun vadede yapmak isteyebilir, ancak bu zaten var olan satırları güncellememelidir. En azından, zaten var olan satırları güncellemediğini umuyorum. –

+0

@Brian: Yapıyor :) ... (Sıkı modda çalışmadıkça sanırım.) –

+0

Evet, bu işe yarıyor. Oldukça genel 'DATA TRUNCATED' uyarısını alabileceğinizi unutmayın, ancak hiçbir şey gerçekten kesilmemiştir - bu (biraz yanıltıcı hata mesajlarından sadece bir tanesidir) (http://dev.mysql.com/doc/refman/5.1/en /faqs-cjk.html#qandaitem-24-11-1-1). – Mike

0

Orada olduğuna inanmıyorum; Satır satırında çalışan ve herhangi bir deyim ile güncelleştirmediğiniz satırları güncelleyebilecek herhangi bir ifade. Jason'ın cevabı doğru, ama bence, biraz güvensiz, gerçekten istediğin şeyin bu olduğundan emin değilsen.

14

Bunu yapabilirsiniz - her sütun için gerektiğinde tekrar:

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

Örnek:

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

GÜNCELLEME sütunları değiştirerek tablo yapısını değiştirmeye istiyorsanız

Artık boş değerleri kabul etmemek için, saklı bir yordamla yapabilirdiniz. Aşağıdaki saklı yordam, verilen bir veritabanı tablosundaki sütunlar hakkında bilgi için INFORMATION_SCHEMA COLUMNS sorgular. Bu bilgiden, daha sonra tablo yapısını değiştirmek için kullanılan hazırlanmış bir ifade oluşturur.

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 ; 

Örnek:

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 

aşağıdaki satırı komutu görüntüler o NOT NULL set yok INT sütunlar arar, şu anda - Sen tam gereksinimlerine uygun değişiklikler yapmanızı gerektirecek bu yürütülecek olan ve gerektiğinde saklı yordam uzaklaştırılabilir:

SELECT @alter_cmd; 
+0

Sadece 'UPDATE test SET kullanmış userID = IFNULL (userId, 1);' ve çalıştı –

0

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

Aşağıdaki

  1. columnY sonra yeni bir sütun columnX ekler gelmez.
  2. Eğer 0'a boş değiştirmek ya gerektiğini kaç sütun meraktan columnX

  columnY    columnX 

     | cellValueA  |  1  |   
     | cellValueB  |  1  | 
     | cellValueC  |  1  | 
     | cellValueD  |  1  |