2009-11-11 17 views
7

यह काफी सरल लगता है: मैं एक SQLite तालिका में एक पंक्ति डुप्लिकेट करना चाहते हैं:SQLite में डुप्लिकेट पंक्तियों को एक अद्वितीय आईडी के साथ कैसे सम्मिलित करें?

INSERT INTO table SELECT * FROM table WHERE rowId=5; 

अगर वहाँ थे कोई स्पष्ट अद्वितीय स्तंभ घोषणाओं, बयान काम करेगा, लेकिन तालिका के पहले कॉलम rowID INTEGER NOT NULL PRIMARY KEY घोषित किया जाता है। क्या ऊपर दिए गए एक साधारण कथन को बनाने का कोई तरीका है जो टेबल की स्कीमा (पहले कॉलम से अलग) को जानने के बिना काम करता है?

उत्तर

5

ठीक है, क्योंकि मैं जिस तरह से चाहता था, वैसे ही ऐसा करने में असमर्थ था, मैंने निहित पंक्ति आईडी का उपयोग करने का सहारा लिया, जो कि पर्याप्त रूप से पर्याप्त नाम के समान नाम है, जिसे मैंने स्पष्ट रूप से परिभाषित किया है, इसलिए अब मैं क्वेरी का उपयोग कर सकता हूं। सवाल में था, और यह एक नई पंक्ति आईडी के साथ सभी डेटा डालेगा। बाकी कार्यक्रम को काम करने के लिए, मैंने अभी SELECT * FROM table से SELECT rowId,* FROM table और सबकुछ ठीक किया है।

+1

चुनता है। यह मेरे लिए काम नहीं करता है, यह कहता है कि 'एन + 1 मान प्रदान किए गए हैं जहां एन कॉलम उपलब्ध हैं' –

8

नहीं। आपको सम्मिलित कथन को सही तरीके से लिखने के लिए तालिका की स्कीमा जानने की आवश्यकता है।

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

insert into Table (column1, column2, column3) 
select column1, column2, column3 
from OtherTable 
where rowId = 5 
0

बिल्कुल कोई रास्ता नहीं यह करने के लिए। प्राथमिक कुंजी घोषणा का तात्पर्य यह है कि यह क्षेत्र अद्वितीय है। आपके पास एक अद्वितीय अद्वितीय पीके नहीं हो सकता है। एक ही तालिका में मौजूदा पीके के साथ एक पंक्ति बनाने का कोई तरीका नहीं है।

+2

मेरा प्रश्न पंक्तियों के साथ और अधिक था, मैं पंक्ति के लिए NULL कैसे निर्दिष्ट कर सकता हूं ताकि यह स्वचालित रूप से अगली उपलब्ध आईडी –

19

यह तालिका के स्कीमा (प्राथमिक कुंजी के नाम के अलावा) के बिना * वाक्यविन्यास का उपयोग करके किया जा सकता है। यह चाल "टेबल बनाएं AS" वाक्यविन्यास का उपयोग करके अस्थायी तालिका बनाना है।

इस उदाहरण में मुझे लगता है कि "आईडी" नामक एक मौजूदा, आबादी वाली तालिका है जिसे "आईडी" कहा जाता है, साथ ही साथ कई अन्य कॉलम भी हैं। "Src" की पंक्तियों डुप्लिकेट बनाने के लिए, sqlite3 में निम्नलिखित एसक्यूएल का उपयोग करें:

CREATE TEMPORARY TABLE tmp AS SELECT * FROM src; 
UPDATE tmp SET id = NULL; 
INSERT INTO src SELECT * FROM tmp; 
DROP TABLE tmp; 

ऊपर के उदाहरण तालिका "src" की सभी पंक्तियों डुप्लिकेट। वांछित पंक्ति को केवल डुप्लिकेट करने के लिए, बस पहली पंक्ति में WHERE क्लॉज जोड़ें। यह उदाहरण काम करता है क्योंकि तालिका "tmp" में कोई प्राथमिक कुंजी बाधा नहीं है, लेकिन "src" करता है। स्रोत में पूर्ण प्राथमिक कुंजी डालने से उन्हें स्वत: जेनरेट किए गए मान दिए जाते हैं।

SQLite प्रलेखन से: http://www.sqlite.org/lang_createtable.html

ए 'तालिका बनाएं ... के रूप में चयन "बयान बनाता है और एक डेटाबेस एक SELECT कथन के परिणामों पर आधारित तालिका भरता है। CREATE तालिका का उपयोग करके बनाई गई एक तालिका के रूप में कोई प्राथमिक कुंजी नहीं है और किसी भी प्रकार की बाधा नहीं है।

यदि आप वास्तव में फैंसी प्राप्त करना चाहते हैं, तो आप एक ट्रिगर जोड़ सकते हैं जो एक तीसरी तालिका अपडेट करता है जो पुरानी प्राथमिक कुंजी को नई जेनरेट की गई प्राथमिक कुंजी के लिए मानचित्र करता है।

+1

I वास्तव में छोटे चालक के लिए कामकाज पसंद नहीं है। लेकिन यह एटीएम करने का सबसे अच्छा तरीका है। –

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