আমি কীভাবে দুটি মাইএসকিউএল টেবিল একীভূত করতে পারি?


94

একই কাঠামোযুক্ত দুটি মাইএসকিউএল টেবিলকে আমি কীভাবে মার্জ করব?

দুটি টেবিলের প্রাথমিক কীগুলি সংঘর্ষ হবে, তাই আমি এটি অ্যাকাউন্টে নিয়েছি।


6
আপনি যখন বলছেন যে পিকেগুলি সংঘর্ষে লিপ্ত হতে পারে, আপনি কি বোঝাতে চেয়েছেন যে এখানে নকল সারি থাকতে পারে এবং আপনি সেগুলি অনুলিপি করতে চান না বা তাদের একটিতে আপনাকে নতুন পিকে বরাদ্দ দেওয়া দরকার কারণ তারা সত্যই আলাদা সারি থাকা সত্ত্বেও একই পিকে? (প্রাকৃতিক প্রাথমিক কীগুলি ব্যবহারের আর একটি কারণ)
টম এইচ

উত্তর:


124

আপনিও চেষ্টা করতে পারেন:

INSERT IGNORE
  INTO table_1 
SELECT *
  FROM table_2
     ;

যা এখনও টেবিল_1 এ থাকা সারিগুলিকে টেবিল_2 এ মেশানো প্রাথমিক কী রয়েছে তার পরেও নতুন প্রাথমিক কী সহ সারিগুলি সন্নিবেশ করানোর অনুমতি দেয়।

বিকল্পভাবে,

REPLACE
   INTO table_1
 SELECT *
   FROM table_2
      ;

নতুন প্রাথমিক কীগুলির সাথে সারিগুলি সন্নিবেশ করার সময়, টেবিল_2 থেকে সংশ্লিষ্ট সারিটি ইতিমধ্যে টেবিল_1 এ থাকা সারিগুলি আপডেট করবে।


4
প্রকৃতপক্ষে, এটি বিদ্যমান সারিগুলিকে প্রতিস্থাপন করবে (আপডেট + সন্নিবেশ করান), আপডেট হবে না।
সিস টিমারম্যান

টেবিল 2 এর জন্য কোনও বিদেশী কী ব্যবহার করা থাকলে কী হবে ????? আপনি কিভাবে এটি আপডেট করবেন?
ক্ষিতাইজ

39

এটি প্রাথমিক কী এর শব্দার্থবিজ্ঞানের উপর নির্ভর করে। যদি এটি কেবল স্ব-স্বীকৃতি হয় তবে এর মতো কিছু ব্যবহার করুন:

insert into table1 (all columns except pk)
select all_columns_except_pk 
from table2;

পিকে যদি কিছু বোঝায়, কোন রেকর্ডটির অগ্রাধিকার থাকা উচিত তা নির্ধারণ করার জন্য আপনাকে একটি উপায় সন্ধান করতে হবে। আপনি প্রথমে সদৃশ সন্ধানের জন্য একটি নির্বাচিত ক্যোয়ারী তৈরি করতে পারেন ( সিপাইটিসের উত্তর দেখুন )। তারপরে রেকর্ডগুলি যুক্ত করতে উপরের সন্নিবেশটিকে আপনি রাখতে চান না এবং ব্যবহার করতে চান না তা মুছে দিন।


22
INSERT
INTO    first_table f
SELECT  *
FROM    second_table s
ON DUPLICATE KEY
UPDATE
        s.column1 = DO_WHAT_EVER_MUST_BE_DONE_ON_KEY_CLASH(f.column1)

4
ভাল ধারণা জন্য ধন্যবাদ। উপরের সিএমডি যদিও আমাকে একটি সিনট্যাক্স ত্রুটি দেয়। তবে এটি আমার জন্য কাজ করে: প্রথম প্রথম টেবিল নির্বাচন করুন * দ্বৈত কী আপডেটের দ্বিতীয় সারণি থেকে দ্বিতীয়_তুল্য দ্বিতীয়_ টেবিল। কলাম 1 = ডিওএইচএইচএইচ_ইভি.ম.স.বি.বি.কন_কোন_ক্ল্যাশ (প্রথম_সারণযোগ্য কলাম 1)
টেপার

@ টেপারের মতো, আমি প্রথম টেবিলটিতে একটি এলিয়াস নির্ধারণ করতে পারি না। আমি Syntax error, unexpected IDENT_QUOTEDযেভাবেই হোক মাইএসকিউএল ওয়ার্কবেঞ্চের মাধ্যমে পেয়ে যাব ।
blo0p3r

আপনি শেষ লাইনে কোন আদেশটি প্রবেশ করবেন তার একটি উদাহরণ দিতে পারেন? আমি চাইব আইডিটি সারণীর সর্বাধিক বিদ্যমান আইডি থেকে বর্ধিত হোক
এলিয়ট বি

15

আপনার যদি নিজে থেকে এটি করার প্রয়োজন হয় তবে একবার:

প্রথমে অস্থায়ী সারণীতে মার্জ করুন, এর মতো কিছু দিয়ে:

create table MERGED as select * from table 1 UNION select * from table 2

তারপরে, প্রাথমিক কী বাধার মতো কিছু দিয়ে চিহ্নিত করুন

SELECT COUNT(*), PK from MERGED GROUP BY PK HAVING COUNT(*) > 1

যেখানে পিকে প্রাথমিক কী ক্ষেত্র ...

সদৃশগুলি সমাধান করুন।

টেবিলটির নতুন নাম দিন।

[সম্পাদিত - ইউনিয়ন কোয়েরিতে ব্র্যাকেটগুলি সরানো হয়েছে, যা নীচের মন্তব্যে ত্রুটি সৃষ্টি করেছিল]


যখন আমি এটি চেষ্টা করি তখন আমি এই ত্রুটিটি ফিরে পেয়েছি, "ERROR 1064 (42000): আপনার এসকিউএল সিনট্যাক্সে আপনার একটি ত্রুটি রয়েছে; 'ইউনিয়ন সিলেক্ট * অভিনেতার কাছ থেকে সিলেক্ট করুন' ব্যবহার করতে ডান সিনট্যাক্সের জন্য আপনার মাইএসকিউএল সার্ভার সংস্করণের সাথে সম্পর্কিত ম্যানুয়ালটি পরীক্ষা করুন) লাইন এ ", কেন?
jcho360

7

এটি যতটা জটিল শোনাচ্ছে ততটা জটিল নয় .... কেবলমাত্র আপনার প্রশ্নের বাইরে সদৃশ প্রাথমিক কীটি ছেড়ে দিন .... এটি আমার পক্ষে কাজ করে!

INSERT INTO
  Content(
    `status`,
    content_category,
    content_type,
    content_id,
    user_id,
    title,
    description,
    content_file,
    content_url,
    tags,
    create_date,
    edit_date,
    runs
  )
SELECT `status`,
  content_category,
  content_type,
  content_id,
  user_id,
  title,
  description,
  content_file,
  content_url,
  tags,
  create_date,
  edit_date,
  runs
FROM
  Content_Images

0

আপনার জন্য এফকে আপডেট করার জন্য আপনি একটি স্ক্রিপ্ট লিখতে পারেন .. এই ব্লগটি পরীক্ষা করে দেখুন: http://multunus.com/2011/03/how-to-easily-mitted-two-identical-mysQL- ডেটাবেসস /

"আইডি" কলাম পেতে তথ্য_স্কেমার টেবিলগুলি ব্যবহার করার জন্য তাদের কাছে একটি চতুর স্ক্রিপ্ট রয়েছে:

SET @db:='id_new'; 

select @max_id:=max(AUTO_INCREMENT) from information_schema.tables;

select concat('update ',table_name,' set ', column_name,' = ',column_name,'+',@max_id,' ; ') from information_schema.columns where table_schema=@db and column_name like '%id' into outfile 'update_ids.sql';

use id_new
source update_ids.sql;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.