2013-04-04 10 views
8

के दौरान शून्य या खाली डेटा को 0 पर डिफ़ॉल्ट कैसे बनाया जाए, ऐसा लगता है कि यह बहुत सीधे आगे होगा और मैं कसम खाता हूं कि मैंने पहले यह किया है, लेकिन किसी कारण से यह मेरे लिए काम नहीं कर रहा है।MYSQL: सम्मिलित

मैं MAMP का उपयोग कर रहा हूं और लगभग 200 कॉलम के साथ एक टेबल है और मैं उनमें से लगभग 20 को डिफ़ॉल्ट में 0 या डिफ़ॉल्ट डेटा डालने पर डिफ़ॉल्ट करना चाहता हूं।

यहाँ मैं क्या मेरी मेज मैं कॉलम है कि मैं तो BathsFull पर नोटिस 0.

के लिए डिफ़ॉल्ट करना चाहते हैं के लिए क्या किया है और साथ ही की तरह दिखता है यह NOT NULL DEFAULT '0' समस्या के लिए निर्धारित किया की एक छोटा सा उदाहरण है यह है कि जब खाली डेटा पास हो जाता है तो मुझे SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'BathsFull' cannot be null की SQL त्रुटि मिलती है।

मैं भी इतना है कि BathsFull accepts शून्य and डिफ़ॉल्ट '0', लेकिन जब खाली डेटा पारित हो जाता है, टेबल NULL बजाय 0 से पता चलता कोशिश की है।

क्या मुझे यहां कुछ याद आ रही है? क्या मुझे कुछ प्रकार के ट्रिगर लिखने की ज़रूरत है? अगर मुझे ऐसा करने की ज़रूरत नहीं है तो मैं इसे डीबी में डालने से पहले अपनी स्क्रिप्ट में डेटा साफ़ करना नहीं चाहता हूं।

+0

[MySQL - स्तम्भ में व्यर्थ मान सम्मिलित नहीं कर सकते, लेकिन मैं एक डिफ़ॉल्ट मान निर्दिष्ट है?] के संभावित डुप्लिकेट (http: // stackoverflow.com/questions/3384668/mysql-cannot-insert-null-value-in-column-but-i-have-a-default-value- निर्दिष्ट) –

उत्तर

2

में खुद के लिए कोशिश करो आप निश्चित रूप से यह मानते हुए कि आप क्षेत्र नल बनाने कि

के लिए एक ट्रिगर का उपयोग कर सकते

CREATE TABLE `listings` (
    `ListingID` int(11) NOT NULL, 
    `BathsFull` int(6),    <----- 
    PRIMARY KEY (`ListingID`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

ट्रिगर

DELIMITER $$ 
CREATE TRIGGER tg_lst_insert BEFORE INSERT ON listings 
FOR EACH ROW 
BEGIN 
    SET NEW.BathsFull = IFNULL(NEW.BathsFull, 0); 
END $$ 
DELIMITER ; 

कुछ पंक्तियाँ सम्मिलित करना

INSERT INTO `listings` VALUES(1, ''); 
INSERT INTO `listings` VALUES(3, 'a'); 
INSERT INTO `listings` VALUES(4, NULL); 
INSERT INTO `listings` (ListingID) VALUES(2); 
INSERT INTO `listings` VALUES(5, 3); 

परिणाम

+-----------+-----------+ 
| ListingID | BathsFull | 
+-----------+-----------+ 
|   1 |   0 | 
|   2 |   0 | 
|   3 |   0 | 
|   4 |   0 | 
|   5 |   3 | 
+-----------+-----------+ 
+0

मैंने इसे एक शॉट दिया लेकिन मुझे निम्न त्रुटि मिल रही है 'त्रुटि: SQLSTATE [HY000]: सामान्य त्रुटि: 1436 थ्रेड स्टैक ओवररन: 15168 बाइट 131072 बाइट स्टैक और 128000 बाइट्स की आवश्यकता होती है। एक बड़ा स्टैक निर्दिष्ट करने के लिए 'mysqld --thread_stack = #' का उपयोग करें। – bigmike7801

+2

थ्रेड_स्टैक पैरामीटर के मान को 1 9 2 (256) केबी में बढ़ाएं। यह SO प्रश्न देखें http://stackoverflow.com/a/5264965/1920232 और mysql दस्तावेज़ http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_thread_stack – peterm

1

आप प्रविष्टि के दौरान कॉलम का डिफ़ॉल्ट मान प्राप्त करने के लिए default कीवर्ड का उपयोग कर सकते हैं।

उदाहरण:

INSERT INTO listings(ListingID, BathsFull) VALUES (2,DEFAULT); 
+0

मैं अपनी सम्मिलित स्क्रिप्ट के लिए केकेपीएचपी का उपयोग कर रहा हूं, इसलिए यह नहीं है बस इतना बदलना आसान है कि मेरा सम्मिलन कथन कैसा दिखता है। यही कारण है कि मैं चाहता हूं कि MySQL इसे संभाल लें। – bigmike7801

+0

मैं इससे परिचित नहीं हूं इसलिए मैं वास्तव में मदद नहीं कर सकता हूं कि आप आल्वरो जी। विकारियो के समाधान – DessDess

1

हो सकता है कि आप इस प्रयास करना चाहिए:

insert into listings (ListingID, ListingID, BathsFull) 
values (@listing_id, @ListingID, isnull(BathsFull, 0) 
1

आप सम्मिलित प्रश्नों पोस्ट करने के लिए भूल गया, लेकिन मुझे यकीन है कि समस्या है हूँ। यह काम करता है के रूप में उम्मीद:

insert into listings (ListingID) values(1) 

... क्योंकि आप को छोड़ देते हैं BathsFull तो MySQL defalt उपयोग करता है। यह नहीं करता है:

insert into listings (ListingID, BathsFull) values(1, null); 

... कि आप NULL चाहते हैं, क्योंकि आपके MySQL कह रहे हैं।

3

यदि आप स्पष्ट रूप से अपने सम्मिलन में NULL को मान सेट कर रहे हैं, लेकिन MySQL को 0 के साथ NULL को प्रतिस्थापित करना चाहते हैं, तो ऐसा करने का एक तरीका कॉलम को परिभाषित करना है ताकि CREATE TABLE कथन में NULL को अनुमति दें और फिर NULL को प्रतिस्थापित करें TRIGGER के साथ।

कुछ इस तरह:

CREATE TABLE `listings` (
    `ListingID` int(11) NOT NULL, 
    `BathsFull` int(6) NULL DEFAULT 0, 
    PRIMARY KEY (`ListingID`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

delimiter $$ 

create trigger tr_b_ins_listings before insert on listings for each row 
begin 
    set new.BathsFull = coalesce(new.BathsFull,0); 
end $$ 

delimiter ; 

इस SQL Fiddle

+0

का उपयोग कर सकते हैं कृपया टिप्पणी देखें कि मैंने पेटर्म के जवाब में रखा है। – bigmike7801

संबंधित मुद्दे