निम्नलिखित MySQL परीक्षण तालिका पर विचार करें:
CREATE TABLE `customers` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL,
`email` varchar(100) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
मौजूदा नमूना डेटा के साथ निम्नानुसार है:
id name email
-- -------------- ----------------
1 Loblaw, Bob example@sqldat.com
2 Thompson, Gord example@sqldat.com
डिफ़ॉल्ट कनेक्शन सेटिंग के साथ compensateOnDuplicateKeyUpdateCounts=false (वर्णित यहां
) निम्नलिखित जावा कोड
PreparedStatement ps = dbConnection.prepareStatement(
"INSERT INTO customers (name, email) " +
"VALUES (?, ?) " +
"ON DUPLICATE KEY UPDATE " +
"name = VALUES(name), " +
"id = LAST_INSERT_ID(id)");
ps.setString(1, "McMack, Mike");
ps.setString(2, "example@sqldat.com");
int euReturnValue = ps.executeUpdate();
System.out.printf("executeUpdate returned %d%n", euReturnValue);
Statement s = dbConnection.createStatement();
ResultSet rs = s.executeQuery("SELECT LAST_INSERT_ID() AS n");
rs.next();
int affectedId = rs.getInt(1);
if (euReturnValue == 1) {
System.out.printf(" => A new row was inserted: id=%d%n", affectedId);
}
else {
System.out.printf(" => An existing row was updated: id=%d%n", affectedId);
}
निम्न कंसोल आउटपुट उत्पन्न करता है
executeUpdate returned 1
=> A new row was inserted: id=3
अब उसी कोड को फिर से पैरामीटर मानों के साथ चलाएँ
ps.setString(1, "Loblaw, Robert");
ps.setString(2, "example@sqldat.com");
और कंसोल आउटपुट है
executeUpdate returned 2
=> An existing row was updated: id=1
यह दर्शाता है कि .executeUpdate वास्तव में 2 वापस आ सकता है यदि अद्वितीय अनुक्रमणिका मौजूदा पंक्ति को अद्यतन करने का कारण बनती है। अगर आपको अपने वास्तविक . के साथ और सहायता की आवश्यकता है परीक्षण कोड तो आपको इसे शामिल करने के लिए अपना प्रश्न संपादित करना चाहिए।
संपादित करें
आगे के परीक्षण से पता चलता है कि .executeUpdate 1 लौटाएगा अगर
- प्रयास किए गए INSERT को निरस्त कर दिया गया है क्योंकि इसके परिणामस्वरूप एक डुप्लिकेट UNIQUE कुंजी मान होगा, और
- डिप्लिकेट कुंजी अद्यतन पर निर्दिष्ट परिवर्तन मौजूदा पंक्ति में किसी भी मान को वास्तव में संशोधित नहीं करते हैं ।
उपरोक्त परीक्षण कोड को समान पैरामीटर मानों के साथ लगातार दो बार चलाकर इसकी पुष्टि की जा सकती है। ध्यान दें कि UPDATE ... id = LAST_INSERT_ID(id) "ट्रिक" यह सुनिश्चित करती है कि सही id मान लौटा दिया जाता है।
यह शायद ओपी के परीक्षा परिणामों की व्याख्या करता है यदि डाला जा रहा एकमात्र मूल्य अद्वितीय कुंजी मूल्य था।