2010-07-04 26 views
16

मैं पाठ्यक्रमअद्यतन सब शून्य क्षेत्रों MySQL

UPDATE mytable SET firstcol=0 WHERE firstcol IS NULL 

के 0 पर एक तालिका में सभी शून्य फ़ील्ड अपडेट कर काम करना होगा चाहते हैं। लेकिन मुझे आश्चर्य है कि क्या प्रत्येक कॉलम के लिए यह लाइन सी & पी से एक बेहतर समाधान है।

+1

स्तंभ भर 1 डिफ़ॉल्ट जिज्ञासा से बाहर कितने कॉलम आपको लगता है कि आप अशक्त 0 से बदल सकते हैं या करने की जरूरत है w/ई EHHE :) – Prix

+0

यह बस जिज्ञासा है। इस विशेष मामले में, मुझे कुछ भी चाहिए नहीं क्योंकि यह केवल 5 या 6 कोल है। लेकिन अन्य टेबल जो मैं आसानी से काम करता हूं 60 कॉलम प्राप्त करता है। यही कारण है कि मैं जानना चाहता हूं कि इस तरह के परिदृश्य में इसे कैसे करना है। –

उत्तर

6

तुम सिर्फ ALTERNOT NULL DEFAULT 0 करने के लिए कॉलम कर सकते हैं?

आप प्रति MySQL documentation के रूप में एक बयान में यह कर सकते हैं,:

आप एक से अधिक जोड़ने के लिए, एक भी ALTER टेबल बयान में ALTER छोड़ देते हैं और बदलें खंड, अल्पविराम के द्वारा अलग जारी कर सकते हैं। यह मानक एसक्यूएल के लिए एक MySQL एक्सटेंशन है, जो प्रत्येक खंड प्रति अलर्ट तालिका कथन में से केवल एक को अनुमति देता है।

+0

हम्म, तालिका एक निर्माण तालिका mytable AS SELECT ... कथन जिसमें केस शामिल हैं के साथ बनाया गया है। किसी भी तरह से मैं वहां डिफ़ॉल्ट मान सेट करने में सक्षम नहीं था। यही कारण है कि मैं नल मूल्यों के साथ समाप्त हुआ। अगर मैं उस तालिका को बदलता हूं तो मुझे इसे प्रत्येक कॉलम के लिए अलग से करना होगा जो कि मैं रोकने की कोशिश कर रहा हूं। –

+0

@ ran2: MySQL में नहीं, आप इसे प्रतिबिंबित करने के लिए संपादित नहीं करते हैं। – Piskvor

+0

thx, जाहिर है, मुझे इस तथ्य के बारे में पता नहीं था। फिर भी, मुझे आश्चर्य है कि मुझे ऐसे सभी कथन में सभी कॉलम सूचीबद्ध करना है या नहीं। मैं सिर्फ पूरी टेबल के लिए ऐसा करना चाहता हूं, क्योंकि अगर मेरे पास 60 कॉलम थे, तो यह सभी को सूचीबद्ध करने के लिए बदसूरत होगा - कोई फर्क नहीं पड़ता कि एक या एकाधिक कथन में कोई फर्क नहीं पड़ता। –

2

बिना मध्यवर्ती तकनीक या कर्सर के। आप क्वेरी बनाने के लिए कॉलम नाम और लूप प्राप्त करने के लिए DESCRIBE mytable; का उपयोग कर सकते हैं।

तो यह संभव है। लेकिन जब तक आप इसे लिखने के लिए ले गए, तो शायद आप कॉपी और पेस्ट कर सकते थे;)

+0

मुझे स्वीकार करना होगा, या तो मुझे जवाब नहीं मिलेंगे या बस बुरी तरह पोस्ट किया जाएगा। हालांकि, जोसन ने कहा वह मुझे क्या लगा। मुझे आश्चर्य है कि कोई समाधान है लेकिन एक लूप है। मुझे अभी तक एसक्यूएल में लूप की आवश्यकता नहीं है और इस तरह कोई अनुभव नहीं है :) –

+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

@ ब्रायन: यह करता है :) ... (मुझे लगता है कि सख्त मोड में चलने तक।) –

+0

हां, यह काम करता है। ध्यान दें कि आपको अपेक्षाकृत सामान्य 'डेटा ट्रांस्केटेड' चेतावनी मिल सकती है, लेकिन वास्तव में कुछ भी छोटा नहीं किया गया है - यह उनमें से एक है [थोड़ा भ्रामक त्रुटि संदेश] (http://dev.mysql.com/doc/refman/5.1/en /faqs-cjk.html#qandaitem-24-11-1-1)। – Mike

0

मुझे विश्वास नहीं है कि वहां है; कोई भी बयान जो पंक्तियों पर काम करता है, जो इस खंड को संतुष्ट नहीं करता है कि उन पंक्तियों को अपडेट किया जाएगा जिन्हें आप अपडेट करने का इरादा नहीं रखते थे। जेसन का जवाब सही है, लेकिन, मुझे लगता है, थोड़ा असुरक्षित, जब तक कि आप वास्तव में सुनिश्चित नहीं हैं कि आप क्या चाहते हैं।

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

अद्यतन

आप कॉलम बदलकर तालिका ढांचे में परिवर्तन करना चाहते हैं ताकि वे अब नल स्वीकार नहीं कर सकें, आप इसे संग्रहीत प्रक्रिया के साथ कर सकते हैं। निम्नलिखित संग्रहीत प्रक्रिया किसी दिए गए डेटाबेस तालिका में कॉलम के बारे में जानकारी के लिए INFORMATION_SCHEMA COLUMNS से पूछताछ करती है। उस जानकारी से, यह एक तैयार कथन तैयार करता है जिसका उपयोग तब तालिका संरचना को बदलने के लिए किया जाता है।

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 

निम्न पंक्ति आदेश को प्रदर्शित करता है यह INT कॉलम जो NOT NULL सेट नहीं है के लिए लग रहा है क्षण में, - आप इसे अपने सटीक आवश्यकताओं के अनुरूप बदलाव करने की आवश्यकता हो सकती कि निष्पादित करने के लिए है, और संग्रहीत प्रक्रिया यदि आवश्यक हो तो से हटाया जा सकता:

SELECT @alter_cmd; 
+0

मैंने केवल 'अद्यतन परीक्षण SET userID = IFNULL (userId, 1) का उपयोग किया;' और यह काम करता था –

0

ALTER तालिका dataBaseNametableName COLUMN columnX आईएनटी (20) नल डिफॉल्ट 1 columnY के बाद;

यह निम्न

  1. columnY के बाद एक नया स्तंभ columnX कहते है।
  2. अपने मूल्य सेट columnX

  columnY    columnX 

     | cellValueA  |  1  |   
     | cellValueB  |  1  | 
     | cellValueC  |  1  | 
     | cellValueD  |  1  | 
संबंधित मुद्दे