2013-04-09 4 views
7

में कुल मूल्य के साथ रिकॉर्ड दर्ज करता है पहले INSERT तालिका 2 के लिए क्यों जाता है। ध्यान दें कि table2.col_1 पूर्ण नहीं है। यह col_1 के लिए NULL सम्मिलित नहीं करता है, लेकिन रहस्यमय रूप से NULL मान को खाली स्ट्रिंग में परिवर्तित करता है। मैं MySQL संस्करण 5.5.28 का उपयोग कर रहा हूँ। धन्यवादमाईएसक्यूएल न्यूल कॉलम

mysql> DROP TABLE IF EXISTS table1, table2; 

Query OK, 0 rows affected (0.01 sec) 

mysql> CREATE TABLE IF NOT EXISTS table1 (
    -> id INT UNSIGNED NOT NULL AUTO_INCREMENT , 
    -> col_1 VARCHAR(45) NOT NULL , 
    -> col_2 VARCHAR(45) NOT NULL , 
    -> PRIMARY KEY (`id`)) 
    -> ENGINE = InnoDB; 

Query OK, 0 rows affected (0.01 sec) 

mysql> CREATE TABLE table2 LIKE table1; 
Query OK, 0 rows affected (0.00 sec) 

mysql> INSERT INTO table1 (id, col_1, col_2) VALUES (NULL, "xxx","yyy"); 
Query OK, 1 row affected (0.00 sec) 

mysql> INSERT INTO table2 (id, col_1, col_2) SELECT NULL, NULL, col_2 FROM table1 WHERE id=1; 
Query OK, 1 row affected, 1 warning (0.00 sec) 
Records: 1 Duplicates: 0 Warnings: 1 

mysql> SHOW WARNINGS; 
+---------+------+-------------------------------+ 
| Level | Code | Message      | 
+---------+------+-------------------------------+ 
| Warning | 1048 | Column 'col_1' cannot be null | 
+---------+------+-------------------------------+ 
1 row in set (0.00 sec) 

mysql> SELECT * FROM table2; 
+----+-------+-------+ 
| id | col_1 | col_2 | 
+----+-------+-------+ 
| 1 |  | yyy | 
+----+-------+-------+ 
1 row in set (0.00 sec) 

mysql> INSERT INTO table2 (id, col_1, col_2) VALUES(NULL, NULL, "zzz"); 
ERROR 1048 (23000): Column 'col_1' cannot be null 

mysql> SELECT * FROM table2; 
+----+-------+-------+ 
| id | col_1 | col_2 | 
+----+-------+-------+ 
| 1 |  | yyy | 
+----+-------+-------+ 
1 row in set (0.00 sec) 
+0

शायद यह 'सम्मिलित करता NULL' स्ट्रिंग और नहीं अशक्त (* कुछ नहीं *) –

+0

अजीब, मैं एक ही कर रहा हूँ और मैं क्या nulls डाला हो ... हो सकता है कि आप कर सकते थे जब आप मूल्य बांधते हैं तो पीडीओ :: PARAM_INT निर्दिष्ट करें? – Sebas

+0

@JW कृपया समझाएं। मैंने मूल पोस्ट को यह दिखाने के लिए संपादित किया है कि अगर INSERT को SELECT द्वारा खिलाया जाता है तो यह केवल पंक्ति को कैसे सम्मिलित करता है। – user1032531

उत्तर

7

आपके पास MySQL का STRICT मोड ऑफ़ है। इसे चालू करें और आपको एक त्रुटि मिलेगी। http://php.net/manual/en/pdo.errorinfo.php

+0

धन्यवाद डेविड, मेरा बुरा, पीडीओ या PHP के साथ कुछ लेना देना नहीं है। मैंने इसे दिखाने के लिए मूल पोस्ट संपादित किया। गलतफहमी के लिए खेद है। – user1032531

+0

@ user1032531 मेरी उत्तर को समझने के लिए इस उत्तर को अपडेट किया गया। – DavidScherer

+0

मुझे यकीन है कि आप सही हैं! मैं कभी भी MySQL STRICT मोड के बारे में नहीं जानता था, और इसका परीक्षण करूंगा। धन्यवाद – user1032531

4

यह व्यवहार में अच्छी तरह से MySQL डॉक्स में दर्ज है:

नहीं तो आप के माध्यम से पीडीओ के साथ उन लोगों के लिए चेतावनी का परीक्षण कर सकते हैं। MySQL doc

यदि आप सख्त मोड का उपयोग नहीं कर रहे हैं, तो जब भी आप कॉलम में "गलत" मान डालते हैं, such as a NULL into a NOT NULL column या संख्यात्मक कॉलम में बहुत अधिक संख्यात्मक मान डालते हैं, तो MySQL कॉलम को "सर्वोत्तम संभव मूल्य" पर सेट करता है एक त्रुटि उत्पन्न करने के बजाय:, लेकिन चेतावनी गणना

0

मैंने MySQL के STRICT मोड को सेट करने का प्रयास किया है और मेरे लिए काम नहीं किया है (मैंने इसे "my.ini" में भी बदल दिया है)।

क्या मेरे लिए काम किया था एक BEFORE INSERT TRIGGER

मूल रूप से आप करते हैं:

CREATE TRIGGER triggerName BEFORE INSERT ON customer 
FOR EACH ROW 
BEGIN 
    if new.`customerName` = '' then 
    signal sqlstate '45000' 
    SET MESSAGE_TEXT = 'Customer Name Cannot be Empty!'; 
    end if; 
END 

में MESSAGE_TEXT आप आप त्रुटि दिखाना चाहते हैं जो कुछ भी पाठ जोड़ सकते हैं।

उम्मीद है कि यह मदद करता है!

इसमें से अधिकांश पाया here

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