Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

जावा तैयार स्टेटमेंट और डिप्लिकेट कुंजी अपडेट पर:मुझे कैसे पता चलेगा कि पंक्ति डाली गई थी या अपडेट की गई थी?

निम्नलिखित 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     [email protected]
 2  Thompson, Gord  [email protected]

डिफ़ॉल्ट कनेक्शन सेटिंग के साथ 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, "[email protected]");
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, "[email protected]");

और कंसोल आउटपुट है

executeUpdate returned 2
    => An existing row was updated: id=1

यह दर्शाता है कि .executeUpdate वास्तव में 2 वापस आ सकता है यदि अद्वितीय अनुक्रमणिका मौजूदा पंक्ति को अद्यतन करने का कारण बनती है। अगर आपको अपने वास्तविक . के साथ और सहायता की आवश्यकता है परीक्षण कोड तो आपको इसे शामिल करने के लिए अपना प्रश्न संपादित करना चाहिए।

संपादित करें

आगे के परीक्षण से पता चलता है कि .executeUpdate 1 लौटाएगा अगर

  1. प्रयास किए गए INSERT को निरस्त कर दिया गया है क्योंकि इसके परिणामस्वरूप एक डुप्लिकेट UNIQUE कुंजी मान होगा, और
  2. डिप्लिकेट कुंजी अद्यतन पर निर्दिष्ट परिवर्तन मौजूदा पंक्ति में किसी भी मान को वास्तव में संशोधित नहीं करते हैं

उपरोक्त परीक्षण कोड को समान पैरामीटर मानों के साथ लगातार दो बार चलाकर इसकी पुष्टि की जा सकती है। ध्यान दें कि UPDATE ... id = LAST_INSERT_ID(id) "ट्रिक" यह सुनिश्चित करती है कि सही id मान लौटा दिया जाता है।

यह शायद ओपी के परीक्षा परिणामों की व्याख्या करता है यदि डाला जा रहा एकमात्र मूल्य अद्वितीय कुंजी मूल्य था।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL - रूसी वर्ण गलत तरीके से प्रदर्शित होते हैं

  2. MySQL - कॉलम में कैरेक्टर बदलें

  3. Mysql डुप्लिकेट पंक्तियाँ (2 कॉलम का उपयोग करके डुप्लिकेट का पता लगाया गया)

  4. ImportError:'MySQL' नाम का कोई मॉड्यूल नहीं

  5. समय कम करने और डिस्क पर tmp लिखने के लिए mysql को फिर से लिखना