2013-01-26 12 views
8

मैं इस MySQL क्वेरी निष्पादित करने के लिए करना चाहते हैं:MySQL - सम्मिलित करता है, तो मौजूद नहीं है अभी तक

INSERT INTO `cron-stats` (`user`) VALUES (".(int)$d['by-user'].")

जब भी इस तरह के उपयोगकर्ता ने अभी तक मौजूद नहीं है, के रूप में:

SELECT 1 
FROM `cron-stats` 
WHERE `user` = ".(int)$d['by-user']." 

कैसे कर सकते हैं मैं इसे एक प्रश्न में निष्पादित करता हूं?

+0

क्षेत्र 'बनाने –

+0

unique' और ध्यान न दें के बाद सम्मिलित करें – Strawberry

+0

आप पहले से ही [' INSERT' वाक्य रचना संदर्भ पेज] का अध्ययन करता है (http://dev.mysql.com/doc/refman/5.6/en/ जोड़ने insert.html)? – Gumbo

उत्तर

17

आप ON DUPLICATE KEY UPDATE

INSERT INTO `cron-stats` (`user`) VALUES ('yourValue') 
ON DUPLICATE KEY UPDATE user = user; 

उपयोग कर सकते हैं लेकिन आदेश INSERT बयान में अच्छा प्रदर्शन करने के लिए आपको स्तंभ user पर एक UNIQUE सूचकांक सेट करना होगा।

यदि स्तंभ अभी तक कोई index है, नीचे दिए गए बयान पर अमल,

ALTER TABLE `cron-stats` ADD CONSTRAINT tb_un UNIQUE (`user`) 
+0

सुनिश्चित नहीं है कि इससे मदद मिलती है। मैं इसे एक सीआरओएन में उपयोग कर रहा हूं, जहां मैं मौजूदा प्रविष्टियों के लिए 'अद्यतन 'चला रहा हूं। 'UPDATE' 'रन से पहले, मैं शून्य प्रविष्टियों को INSERTING द्वारा मौजूदा प्रविष्टियों को तैयार नहीं करना चाहता हूं। क्या यह उचित समाधान है? –

+0

क्या कारण है कि आपको पहले शून्य मान डालने की आवश्यकता क्यों है? –

+0

ओह ठीक है, यह काम नहीं करता है। त्रुटि के साथ पूर्ण क्वेरी यहां दी गई है: http://pastebin.com/PyHMY9RG –

5

थोड़ा सा hacky, लेकिन अगर आप VALUES के बजाय एक SELECT ली गई तालिका का उपयोग आप कर सकते हैं:

INSERT INTO `cron-stats`(`user`) 
SELECT u 
FROM (SELECT @dByUser AS u) x 
WHERE NOT EXISTS(SELECT 1 FROM `cron-stats` WHERE `user` = @dByUser) 

SQL Fiddle demo

-2

यदि आप अन्य स्थिति

का उपयोग करके इसे आजमा सकते हैं
$chk = mysql_query("select 'the username' FROM `cron-stats`"); 
$rs = mysql_fetch_array($chk); 
if($rs == "") 
{ 
    $ins = mysql_query("INSERT INTO `cron-stats` (`user`) VALUES ('.(int)$d['by-user'].')"); 
} 
else{ 
    echo "Duplicate entry"; 
} 
+1

यह एक भयानक समाधान है क्योंकि आप प्रदर्शन लाभ और एसीआईडी ​​पर काफी हद तक हार रहे हैं। आपको वास्तव में इसे सही तरीके से काम करने के लिए लेन-देन में लपेटने की ज़रूरत होगी, और फिर भी ऐसा क्यों होगा जब स्पष्ट आदेश हैं जो इतना बेहतर हैं? – Brett

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