INSERT में ... सभी MySQL कॉलम के लिए चयन करें


119

मैं पुराने डेटा को यहां से स्थानांतरित करने का प्रयास कर रहा हूं:

this_table >> this_table_archive

सभी कॉलम को कॉपी करना। मैंने यह कोशिश की है, लेकिन यह काम नहीं करता है:

INSERT INTO this_table_archive (*) VALUES (SELECT * FROM this_table WHERE entry_date < '2011-01-01 00:00:00');

नोट: टेबल समान हैं और idएक प्राथमिक कुंजी के रूप में सेट की गई हैं।


1
परिभाषित करें "यह काम नहीं करता है"। मैं कर रहा हूँ जो एक समान समस्या हो सकती है लेकिन मैं नहीं बता सकता क्योंकि आपने यह नहीं बताया कि आपकी समस्या क्या थी !!
ऑर्बिट

यह टूटा नहीं है, यह सिर्फ काम नहीं करता है।
वेबमास्टर जी

यहां भी देखें /programming/3709560/joining-three-tables-use-mysql

जवाबों:


218

मैनुअल में सही सिंटैक्स का वर्णन किया गया है । इसे इस्तेमाल करे:

INSERT INTO this_table_archive (col1, col2, ..., coln)
SELECT col1, col2, ..., coln
FROM this_table
WHERE entry_date < '2011-01-01 00:00:00';

यदि आईडी कॉलम एक ऑटो-इन्क्रीमेंट कॉलम है और आपके पास पहले से ही दोनों तालिकाओं में कुछ डेटा है तो कुछ मामलों में आप कॉलम सूची से आईडी को छोड़ना चाहते हैं और एक आईडी डालने से बचने के लिए नई आईडी उत्पन्न कर सकते हैं जो पहले से ही मूल में मौजूद है तालिका। यदि आपकी लक्ष्य तालिका खाली है तो यह कोई समस्या नहीं होगी।


73

वाक्यविन्यास के लिए, यह इस तरह दिखता है (स्तंभ सूची को स्पष्ट रूप से "सभी" के लिए छोड़ दें)

INSERT INTO this_table_archive
SELECT *
FROM this_table
WHERE entry_date < '2011-01-01 00:00:00'

प्राथमिक कुंजी त्रुटियों से बचने के लिए यदि आपके पास पहले से ही संग्रह तालिका में डेटा है

INSERT INTO this_table_archive
SELECT t.*
FROM this_table t
LEFT JOIN this_table_archive a on a.id=t.id
WHERE t.entry_date < '2011-01-01 00:00:00'
  AND a.id is null  # does not yet exist in archive

6
बाईं ओर के लिए +1 प्राथमिक कुंजी टकराव से बचने के लिए शामिल हों।
हार्टले ब्रॉडी

23

मार्क बायर्स का जवाब:

कभी-कभी आप हार्डकॉस्ट विवरण भी डालना चाहते हैं अन्यथा कोई अद्वितीय बाधा हो सकती है आदि। तो ऐसी स्थिति में निम्नलिखित का उपयोग करें जहां आप स्तंभों के कुछ मानों को ओवरराइड करते हैं।

INSERT INTO matrimony_domain_details (domain, type, logo_path)
SELECT 'www.example.com', type, logo_path
FROM matrimony_domain_details
WHERE id = 367

यहां डोमेन मूल्य को मेरे द्वारा हार्डकॉन्टेड तरीके से जोड़ा जाता है ताकि अद्वितीय बाधा से छुटकारा मिल सके।


4

क्या आपको मूल्यों के लिए डबल () की आवश्यकता नहीं है? अगर यह कोशिश नहीं है (हालांकि एक बेहतर तरीका होना चाहिए

insert into this_table_archive (id, field_1, field_2, field_3) 
values
((select id from this_table where entry_date < '2001-01-01'), 
((select field_1 from this_table where entry_date < '2001-01-01'), 
((select field_2 from this_table where entry_date < '2001-01-01'), 
((select field_3 from this_table where entry_date < '2001-01-01'));

2
ओपी उपयोग कर रहा है INSERT INTO .. SELECT FROM, नहीं INSERT INTO .. VALUES। अलग सुविधा।
ऑर्बिट

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.