এক এসকিউএল ডাটাবেস থেকে অন্যটিতে ডেটা অনুলিপি করা


141

আমার কাছে সাধারণ ডেটা সহ 2 টি এসকিউএল ডাটাবেস রয়েছে তবে বিভিন্ন উদ্দেশ্য রয়েছে এবং আমি ডেটা পুনরায় জমা দেওয়া এড়াতে চেয়েছিলাম, তাই আমি ভাবছিলাম যে কোনও ডাটাবেস থেকে অন্য একটি ডাটাবেসে পুরো টেবিলটি অনুলিপি করা সম্ভব ছিল কিনা?

উত্তর:


170

আপনাকে ATTACH কমান্ডটি ব্যবহার করে ডেটাবেস এক্স এর সাথে ডেটাবেস এক্স সংযুক্ত করতে হবে , তারপরে আপনি যে সারণীগুলি স্থানান্তর করতে চান তার জন্য উপযুক্ত সন্নিবেশ commands োকানো আদেশগুলি চালান।

INSERT INTO X.TABLE SELECT * FROM Y.TABLE;

বা, যদি কলামগুলি ক্রমানুসারে মিলে না যায়:

INSERT INTO X.TABLE(fieldname1, fieldname2) SELECT fieldname1, fieldname2 FROM Y.TABLE;

1
এছাড়াও যদি এসকিউএল বিশেষজ্ঞের ব্যক্তিগত প্রোগ্রামটি ব্যবহার করা হয় তবে এটি ডান ক্লিক এবং এটি ডাটাবেসগুলিতে একটি সুযোগ দেয়
মেহমেট

6
আপনাকে প্রথমে টেবিল তৈরি করতে হবে!
ক্রিস লুয়েংগো 16'13

55

আমার উদাহরণ হিসাবে বিবেচনা করুন যেখানে আমার দুটি ডাটাবেস রয়েছে যথাঃ allmsa.db এবং atlanta.db। বলুন ডাটাবেস allmsa.db এর মার্কিন যুক্তরাষ্ট্রে সমস্ত এমাসার জন্য সারণী রয়েছে এবং ডাটাবেস আটলান্টা.ডিবি খালি রয়েছে।

আমাদের লক্ষ্যটি হল allmsa.db থেকে আটলান্টা.ডিবিতে টেবিল আটলান্টা অনুলিপি করা।

ধাপ

  1. sqlite3 atlanta.db (আটলান্টা ডাটাবেসে যেতে)
  2. Allmsa.db সংযুক্ত করুন। এটি কমান্ড ATTACH '/mnt/fastaccessDS/core/csv/allmsa.db' AS AM; নোট ব্যবহার করে করা যেতে পারে যে আমরা ডাটাবেসের পুরো পথটি সংযুক্ত করার জন্য দিই।
  3. sqlite> .databases আপনি আউটপুট হিসাবে দেখতে পারেন ব্যবহার করে ডাটাবেস তালিকা চেক করুন
seq নাম ফাইল                                                      
--- --------------- -------------------------------- --------------------------
0 প্রধান / এমএনটি / প্রফেসাক্সেসডিএস / কোর / সিএসভি / আইলান্টা.ডিবি                  
2 এএম / এমএনটি / প্রাতঃরাশি এসডিএস / কোর / সিএসভি /allmsa.db 
  1. এখন আপনি আপনার আসল টার্গেটে আসবেন। কমান্ডটি ব্যবহার করুন INSERT INTO atlanta SELECT * FROM AM.atlanta;

এটি আপনার উদ্দেশ্য পরিবেশন করা উচিত।


2
'আট.এলান্টা থেকে আটলান্টা ইনসার্ট নির্বাচন করুন' ব্যবহার করুন; ' গণ্ডগোল জিনিস। এটি সমস্ত ডেটা অনুলিপি করেছে তবে কিছু ক্ষেত্র অদলবদল হয়েছিল! এটি ব্যবহার করবেন না। পরিবর্তে গৃহীত উত্তর থেকে কমান্ডটি ব্যবহার করুন, বা আরও স্পষ্টভাবে: "INSERT INTO X.TABLE (আইডি, মান) নির্বাচন করুন আইডি, ওয়াই। টেবিলের থেকে মূল্য; এটি আমার পক্ষে ভাল কাজ করেছে।
করিম সোনবল

@ করিমসনবোল কেবলমাত্র পার্থক্য হ'ল স্বীকৃত উত্তর স্থানান্তরটি আপনার সংযুক্ত ডাটাবেসে ব্যাটাবেস থেকে নেওয়া হয়, তবে এই উত্তরটিতে অন্য উপায়।
তুলিনাস কর্ডোভা

@ টুলিনস কর্ডোভা: গৃহীত উত্তর (শেষ রূপ) বোঝায় যে "কলামগুলি ক্রম মেলানো না গেলেও" এটি কাজ করে এমন ক্ষেত্রে এটি আলাদা। আপনি কি বলছেন যে সত্য নয়?
LarsH

51

একক লাইনে সহজ এবং সঠিক উপায়:

sqlite3 old.db ".dump mytable" | sqlite3 new.db

প্রাথমিক কী এবং কলামের প্রকারগুলি রাখা হবে।


1
এটি একধরনের সুস্পষ্ট ... তবে লক্ষ্য-ডাটাবেজে যদি ইতিমধ্যে সেই নামের একটি সারণী থাকে, তবে এটি সম্ভব নয়। সুতরাং ইতিমধ্যে বিদ্যমান সমাধানে সেই সমাধানের সাথে যোগ করা সম্ভব নয় (অন্যথায় দুর্দান্ত)
মার্টিন মিজার

@ মার্টিনমিজার প্রশ্নটি টেবিলগুলি মার্জ না করে টেবিলটি অনুলিপি করার বিষয়ে। আপনি একটি অস্থায়ী ফাইলের সাথে ডাম্পিং করে, ফাইলটি সম্পাদন করে টেবিল তৈরি করতে পারেন এবং অস্থায়ী ফাইলটিকে new.db এর ইনপুট হিসাবে ব্যবহার করে আপনি একত্রীকরণের চেষ্টা করতে পারেন You তবে প্রাথমিক কী নিয়ে দ্বন্দ্বগুলি হতে পারে
বার্নার্ডো রামোস

@ মার্টিনমিসার, আসলে মার্জিং কাজ করে, যদি লক্ষ্য ডিবিতে টেবিল উপস্থিত থাকে তবে আপনি ত্রুটির বার্তা পাবেন, তবে ডেটা অনুলিপি করা হবে।
ভিঙ্কনেটাস

3
আমি ইনস্টল করা এসকিউএলাইটের সংস্করণে @ মার্টিনমিজার (v3.19.3) .dumpকমান্ডটি তৈরি করে CREATE TABLE IF NOT EXISTS ...এবং আমার গন্তব্য সারণি উপস্থিত থাকলেও কোনও ত্রুটি নেই।
উল্টো ইঞ্জিনিয়ার

1
সমস্যাটি সমাধানের সহজ, ইউনিক্স-বান্ধব উপায়। আপনি আমার উর্ধ্বতন প্রাপ্য। ধন্যবাদ!
অগস্টো ডাস্ট্রেরো

9

এক সময়ের কর্মের জন্য, আপনি। ডাম্প এবং। রিড ব্যবহার করতে পারেন।

পুরাতন_ডিব.স্ক্লাইট থেকে আমার_সারণীটি ছিটিয়ে দিন

c:\sqlite>sqlite3.exe old_db.sqlite
sqlite> .output mytable_dump.sql
sqlite> .dump my_table
sqlite> .quit

New_db.sqlite এ টেবিলের অস্তিত্ব নেই তা ধরে নিয়ে ডাম্প পড়ুন

c:\sqlite>sqlite3.exe new_db.sqlite
sqlite> .read mytable_dump.sql

এখন আপনি আপনার টেবিলটি ক্লোন করেছেন। পুরো ডাটাবেসের জন্য এটি করতে, কেবলমাত্র .dump কমান্ডের সারণির নামটি রেখে দিন।

বোনাস: ডাটাবেসে বিভিন্ন এনকোডিং থাকতে পারে।


7

ডাটাবেস থেকে অন্য ডেটাবেসে টেবিল অনুলিপি করার জন্য উদ্দেশ্য-সি কোড

-(void) createCopyDatabase{

          NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
          NSString *documentsDir = [paths objectAtIndex:0];

          NSString *maindbPath = [documentsDir stringByAppendingPathComponent:@"User.sqlite"];;

          NSString *newdbPath = [documentsDir stringByAppendingPathComponent:@"User_copy.sqlite"];
          NSFileManager *fileManager = [NSFileManager defaultManager];
          char *error;

         if ([fileManager fileExistsAtPath:newdbPath]) {
             [fileManager removeItemAtPath:newdbPath error:nil];
         }
         sqlite3 *database;
         //open database
        if (sqlite3_open([newdbPath UTF8String], &database)!=SQLITE_OK) {
            NSLog(@"Error to open database");
        }

        NSString *attachQuery = [NSString stringWithFormat:@"ATTACH DATABASE \"%@\" AS aDB",maindbPath];

       sqlite3_exec(database, [attachQuery UTF8String], NULL, NULL, &error);
       if (error) {
           NSLog(@"Error to Attach = %s",error);
       }

       //Query for copy Table
       NSString *sqlString = @"CREATE TABLE Info AS SELECT * FROM aDB.Info";
       sqlite3_exec(database, [sqlString UTF8String], NULL, NULL, &error);
        if (error) {
            NSLog(@"Error to copy database = %s",error);
        }

        //Query for copy Table with Where Clause

        sqlString = @"CREATE TABLE comments AS SELECT * FROM aDB.comments Where user_name = 'XYZ'";
        sqlite3_exec(database, [sqlString UTF8String], NULL, NULL, &error);
        if (error) {
            NSLog(@"Error to copy database = %s",error);
        }
 }

0

আমার বেকার সার্ভারের কমপ্যাক্ট ডাটাবেস থেকে ডেটা সেক্লাইটে স্থানান্তরিত করা দরকার, সুতরাং এসকিউএল সার্ভার ২০০৮ ব্যবহার করে আপনি টেবিলের উপর ডান ক্লিক করতে পারেন এবং 'স্ক্রিপ্ট টেবিল টু' এবং তারপরে 'তথ্য থেকে সন্নিবেশ' নির্বাচন করতে পারেন। সন্নিবেশের স্টেটমেন্টগুলি অনুলিপি করুন 'জিও' বিবৃতিগুলি সরিয়ে ফেলুন এবং স্ক্লাইট ডেটাবেজে 'স্ক্লাইটের জন্য ডিবি ব্রাউজারের জন্য অ্যাপ্লিকেশন' ব্যবহার করে এটি সফলভাবে কার্যকর হয়েছিল।


0

প্রথম দৃশ্য: DB1.sqlite এবং DB2.sqlite একই টেবিল (টি 1) রয়েছে, তবে DB1 DB2 এর চেয়ে "আপ টু ডেট"। যদি এটি ছোট হয় তবে ডিবি 2 থেকে টেবিলটি ফেলে দিন এবং এটি ডেটা দিয়ে পুনরায় তৈরি করুন:

> DROP TABLE IF EXISTS db2.t1; CREATE TABLE db2.t1 AS SELECT * FROM db1.t1;

দ্বিতীয় দৃশ্য: এটি যদি একটি বড় টেবিল হয় তবে আপনি কোনও INSERT if not existsধরণের সমাধান দিয়ে ভাল হতে পারেন । যদি আপনার একটি Unique Keyকলাম থাকে তবে এটি আরও সোজা এগিয়ে রয়েছে, অন্যথায় আপনাকে ক্ষেত্রগুলির সংমিশ্রণ (সম্ভবত প্রতিটি ক্ষেত্র) ব্যবহার করতে হবে এবং কোনও সময়ে এটি এখনও ঠিক dropএবং createটেবিলটির থেকে দ্রুততর হবে ; এটি সর্বদা আরও সোজা এগিয়ে (কম চিন্তা প্রয়োজন)।


সেটআপ: ডিবি ছাড়াই এসকিউএলাইট খুলুন যা temporaryমেমরির mainডেটাবেস তৈরি করে, তারপরে attachDB1.sqlite এবং DB2.sqlite

> sqlite3
sqlite> ATTACH "DB1.sqlite" AS db1
sqlite> ATTACH "DB2.sqlite" AS db2

এবং .databasesসংযুক্ত ডাটাবেস এবং তাদের ফাইলগুলি দেখতে ব্যবহার করুন ।

sqlite> .databases
main: 
db1: /db/DB1.sqlite
db2: /db/DB2.sqlite

দ্রষ্টব্য: এটি সংরক্ষণ করে না UNIQUEএবং PRIMARY KEYবৈশিষ্ট্যাবলী, তাই যদি আপনি ঐ আছে, হয় আপনি করতে হবে DROP TABLEনিজে এবং CREATEএবং INSERTবা ব্যবহার .dumpএবং .read পদ্ধতি উপরে উল্লিখিত @Thinkeye দ্বারা।
সক্ষম ম্যাক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.