MySQL: पंक्तियों को कैसे कॉपी करें, लेकिन कुछ फ़ील्ड्स को बदलें?


195

मेरे पास बड़ी संख्या में पंक्तियाँ हैं जिन्हें मैं कॉपी करना चाहूंगा, लेकिन मुझे एक फ़ील्ड को बदलने की आवश्यकता है।

मैं उन पंक्तियों का चयन कर सकता हूं जिन्हें मैं कॉपी करना चाहता हूं:

select * from Table where Event_ID = "120"

अब मैं उन सभी पंक्तियों को कॉपी और जब तक की स्थापना नई पंक्तियों का निर्माण करना चाहते Event_IDकरने के लिए 155। मैं यह कैसे हासिल कर सकता हूं?

जवाबों:


279
INSERT INTO Table
          ( Event_ID
          , col2
           ...
          )
     SELECT "155"
          , col2
           ...
      FROM Table WHERE Event_ID = "120"

यहाँ, col2, ... अपनी तालिका में शेष कॉलम ( Event_ID के अलावा अन्य ) का प्रतिनिधित्व करते हैं ।


39
क्या स्तंभ नामों को निर्दिष्ट किए बिना ऐसा करने का कोई तरीका है?
एंड्रयू

4
यह नही है कि मैं जानता हूँ। बेशक, अगर आपकी तालिका में 1000 कॉलम या कुछ पसंद है और आप उन सभी को टाइप नहीं करना चाहते हैं, तो आप अपने SQL स्टेटमेंट को बनाने के लिए SQL स्टेटमेंट लिख सकते हैं :)। जिस तरह से आप यह करेंगे वह टेबल के लिए कॉलम के नाम पाने के लिए information_schema का उपयोग करना होगा। लेकिन यह वास्तव में ओवरकिल है, मैं सिर्फ कॉलम के नाम लिखूंगा।
dcp

3
क्या शेष स्तंभ प्राप्त करने के लिए तारांकन का उपयोग करना संभव होगा?
पीटर

2
लॉग इन करने के लिए अपवोट करने के लिए बस मुझे पता है कि यह पहले से ही है। मुझे लगता है कि यह मुझे कई बार बचाया :) धन्यवाद!
aexl

2
@Bitterblue - क्षमा करें, मुझे आपकी टिप्पणी समझ में नहीं आई। मैंने कभी भी कॉल 2 नहीं कहा, ... वे कॉलम थे जिन्हें आप कॉपी नहीं करना चाहते, मैंने सिर्फ इतना कहा कि वे टेबल से शेष कॉलमों का प्रतिनिधित्व करते हैं। यह स्पष्ट है कि उनकी नकल की जाएगी, अन्यथा, वे SQL कथन में बिल्कुल भी नहीं होंगे।
dcp

140

यह एक ऐसा समाधान है जहाँ आप अपनी तालिका में कई फ़ील्ड रखते हैं और सभी फ़ील्ड टाइप करने से एक उंगली की ऐंठन प्राप्त नहीं करना चाहते हैं, बस उन लोगों में टाइप करें जो आवश्यक हैं :)

कुछ पंक्तियों को एक ही तालिका में कैसे कॉपी करें, कुछ क्षेत्रों में अलग-अलग मान हैं:

  1. सभी पंक्तियों के साथ एक अस्थायी तालिका बनाएं जिसे आप कॉपी करना चाहते हैं
  2. इच्छित तालिका के साथ अस्थायी तालिका में सभी पंक्तियों को अपडेट करें
  3. यदि आपके पास एक ऑटो वेतन वृद्धि क्षेत्र है, तो आपको इसे अस्थायी तालिका में NULL पर सेट करना चाहिए
  4. अस्थायी तालिका की सभी पंक्तियों को अपनी मूल तालिका में कॉपी करें
  5. अस्थायी तालिका हटाएं

तुम्हारा कोड:

CREATE table temporary_table AS SELECT * FROM original_table WHERE Event_ID="155";

UPDATE temporary_table SET Event_ID="120";

UPDATE temporary_table SET ID=NULL

INSERT INTO original_table SELECT * FROM temporary_table;

DROP TABLE temporary_table

सामान्य परिदृश्य कोड:

CREATE table temporary_table AS SELECT * FROM original_table WHERE <conditions>;

UPDATE temporary_table SET <fieldx>=<valuex>, <fieldy>=<valuey>, ...;

UPDATE temporary_table SET <auto_inc_field>=NULL;

INSERT INTO original_table SELECT * FROM temporary_table;

DROP TABLE temporary_table

सरलीकृत / संघनित कोड:

CREATE TEMPORARY TABLE temporary_table AS SELECT * FROM original_table WHERE <conditions>;

UPDATE temporary_table SET <auto_inc_field>=NULL, <fieldx>=<valuex>, <fieldy>=<valuey>, ...;

INSERT INTO original_table SELECT * FROM temporary_table;

चूंकि अस्थायी तालिका का निर्माण TEMPORARYकीवर्ड का उपयोग करता है, यह सत्र समाप्त होने पर स्वचालित रूप से हटा दिया जाएगा (जैसा कि @ ar34z ने सुझाव दिया है)।


7
MySQL TEMPORARYअस्थायी टेबल बनाने के लिए कीवर्ड का समर्थन करता है । CREATE TEMPORARY TABLEसत्र (SQL क्वेरी का एक सेरी) समाप्त होने पर स्वचालित रूप से तालिका का उपयोग बंद हो जाएगा। तालिका को छोड़ना आवश्यक नहीं होगा और यह समान नाम का उपयोग करके अन्य अस्थायी तालिकाओं के साथ संघर्ष नहीं करता है। (उदाहरण के लिए जब लाइव हैकिंग (जिसकी मैं सलाह नहीं देता))
ar34z

1
यह कोड केवल तभी काम करता है जब आप अस्थायी_टेबल के बजाय #temporary_table का उपयोग करते हैं, शायद एक MSSQL मुद्दा?
TruthOf42

16
यह मूल रूप से मेरे लिए पूरी तरह से काम करता है, लेकिन मुझे अस्थायी तालिका में प्राथमिक कुंजी पर एक नल अशक्तता को दूर करना पड़ता है जो मूल तालिका से नकल करने के लिए लगता है। मैंने इसे अपडेट करने से पहले अस्थायी तालिका में परिवर्तन करके इसे ठीक किया: ALTER TABLE temporary_table MODIFY <auto_inc_not_null_field> INT; फिर नल को प्राथमिक कुंजी का अद्यतन विफल नहीं होगा।
स्नोरिस

1
मुझे यह PostgreSQL 9.4 में काम करने के लिए नहीं मिल सकता है Exception: null value in column <auto_inc_not_null_field> violates not-null constraint:। मैंने कोशिश कीALTER TABLE temporary_table ALTER COLUMN <auto_inc_not_null_field> DROP NOT NULL;
N1000

1
मैंने अलग-अलग MySQL और MariaDB संस्करणों के साथ परीक्षण किया। मेरे लिए एकदम सही काम करता है और मैं इस संस्करण को स्वीकृत उत्तर के लिए पसंद करता हूं, जो वास्तव में अक्सर यहां होता है :)
हेक्सेरी सॉफ्टवेयर

41

मान लें कि आपकी तालिका में दो अन्य कॉलम हैं: फू और बार

INSERT INTO Table (foo, bar, Event_ID)
SELECT foo, bar, "155"
  FROM Table
 WHERE Event_ID = "120"

4
क्या स्तंभ नामों को निर्दिष्ट किए बिना ऐसा करने का कोई तरीका है?
एंड्रयू

@PeterBailey MySQL में नया है, क्या आप कृपया कुछ प्रकाश डाल सकते हैं कि कैसे कोड काम करता है: /
3kstc

10

यदि आपके टेबल में कॉलम का भार है और हर एक को टाइप करना नहीं चाहते हैं, तो आप इसे एक अस्थायी टेबल का उपयोग करके कर सकते हैं, जैसे;

SELECT *
INTO #Temp
FROM Table WHERE Event_ID = "120"
GO

UPDATE #TEMP
SET Column = "Changed"
GO

INSERT INTO Table
SELECT *
FROM #Temp

6
नोट: यह मानता है कि आपके पास अपनी मेज में कोई प्राथमिक कुंजी नहीं है
kommradHomer

2

अरे कैसे सभी क्षेत्रों को कॉपी करने के बारे में, उनमें से एक को उसी मूल्य में बदलें + कुछ और।

INSERT INTO Table (foo, bar, Event_ID)
SELECT foo, bar, Event_ID+"155"
  FROM Table
 WHERE Event_ID = "120"

??????????


0

जब तक Event_ID पूर्णांक है, तब तक ऐसा करें:

INSERT INTO Table (foo, bar, Event_ID)
SELECT foo, bar, (Event_ID + 155)
  FROM Table
WHERE Event_ID = "120"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.