মাইএসকিউএলে দুটি সারণীর কাঠামোর তুলনা করার জন্য প্রশ্ন ery


18

আমার এক মাইএসকিউএল ডাটাবেসের ব্যাকআপ প্রক্রিয়াটি স্বয়ংক্রিয় করতে, আমি দুটি সারণীর কাঠামোর তুলনা করতে চাই (বর্তমান সংস্করণ বনাম পুরানো সংস্করণ)।

আপনি কি এমন কোনও কোয়েরি ভাবতে পারেন যা দুটি টেবিলের তুলনা করতে পারে?

এখানে কয়েকটি উদাহরণ সারণী রয়েছে যা আপনি তুলনা করতে পারেন।

CREATE TABLE product_today
(
  pname VARCHAR(150),
  price int,
  PRIMARY KEY (pname)
);

CREATE TABLE product_yesterday
(
  pname VARCHAR(150),
  price int,
  PRIMARY KEY (pname)
);

CREATE TABLE product_2days_back
(
  pname VARCHAR(15),
  price int,
  PRIMARY KEY (pname)
);

প্রথম দুটি টেবিলের অভিন্ন কাঠামো রয়েছে। শেষটি আলাদা। আমার কেবল দুটি টেবিলের আলাদা কাঠামো আছে কিনা তা জানতে হবে। তারা কীভাবে আলাদা সে বিষয়ে আমি আগ্রহী নই।


@ yagmoth555 ধরে নিচ্ছি যে আমার প্রশ্নটি এসএফ-এর পক্ষে পর্যাপ্ত যথেষ্ট বিষয়, যদি আপনি এখানে অনুরূপ উত্তর লিখতে চান তবে আমি এটি গ্রহণ করব accept অন্যথায়, আমি আজ নিজের উত্তরটি পরে দেব।

এটি ঠিক আছে কিনা তা আমি নিশ্চিত নই, তবে আমি একটি উত্তর লিখব, কারণ এটি কোনওভাবেই ফিট করতে পারে, এটি কোনওভাবেই কোনও সার্ভার অ্যাডমিনের প্রশ্ন হতে পারে :) যেমন, আমি যদি টেবিলের কাঠামোর একটি ডাম্প টোড দিয়ে উত্তর দিই, এবং দুজনের মধ্যে একটি গ্রেপ, এটি ফিট ছিল। এটি আমার নিজের মতে একটি ধূসর রেখা

1
এটি নির্ভরযোগ্যভাবে করা অসম্ভব। সফ্টওয়্যার সংশোধনগুলির মধ্যে ডেটা কাঠামোর সমস্ত পরিবর্তন আসলে স্কিমার পরিবর্তন হিসাবে নিজেকে প্রকাশ করে না। কেবল অ্যাপ্লিকেশন বিকাশকারীরা জানেন যে ঠিক কী পরিবর্তিত হয়েছে। যদি বিকাশকারীরা আপনাকে মাইগ্রেশনের জন্য কোনও সরকারী সরঞ্জাম সরবরাহ না করে থাকে তবে আপনাকে অ্যাপ্লিকেশনটির নির্দিষ্ট সংস্করণগুলির মধ্যে কীভাবে স্থানান্তরিত করতে হবে তা তাদের জিজ্ঞাসা করতে হবে।
ক্যাস্পারড

1
আমি একটি নিখরচায় সরঞ্জাম তৈরি করেছি যা দ্বিতীয় টেবিলটিকে প্রথম টেবিলডিফ.কমের মতোই তৈরি করতে পরিবর্তনের বিবৃতি উত্পন্ন করবে । তবুও আলফা।
মিহাই

উত্তর:


34

বর্তমান ডেটাব্যাসে দুটি টেবিল

আপনি যদি দুটি টেবিল পৃথক কিনা তা জানতে চান, এটি চালান

SELECT IF(COUNT(1)>0,'Differences','No Differences') Comparison FROM
(
    SELECT
        column_name,ordinal_position,
        data_type,column_type,COUNT(1) rowcount
    FROM information_schema.columns
    WHERE table_schema=DATABASE()
    AND table_name IN ('product_today','product_yesterday')
    GROUP BY
        column_name,ordinal_position,
        data_type,column_type
    HAVING COUNT(1)=1
) A;

আপনার যদি আসলে পার্থক্যগুলি দেখতে হয় তবে এটি চালান

SELECT column_name,ordinal_position,data_type,column_type FROM
(
    SELECT
        column_name,ordinal_position,
        data_type,column_type,COUNT(1) rowcount
    FROM information_schema.columns
    WHERE table_schema=DATABASE()
    AND table_name IN ('product_today','product_yesterday')
    GROUP BY
        column_name,ordinal_position,
        data_type,column_type
    HAVING COUNT(1)=1
) A;

দুটি নির্দিষ্ট টেস্টাবলিতে একটি বিশেষ ডেটাবেস

যদি আপনি জানতে চান যে দুটি টেবিল ডাটাবেসে পৃথক কিনা mydb, এটি চালান

SELECT IF(COUNT(1)>0,'Differences','No Differences') Comparison FROM
(
    SELECT
        column_name,ordinal_position,
        data_type,column_type,COUNT(1) rowcount
    FROM information_schema.columns
    WHERE table_schema='mydb'
    AND table_name IN ('product_today','product_yesterday')
    GROUP BY
        column_name,ordinal_position,
        data_type,column_type
    HAVING COUNT(1)=1
) A;

আপনার যদি আসলে পার্থক্যগুলি দেখতে হয় তবে এটি চালান

SELECT column_name,ordinal_position,data_type,column_type FROM
(
    SELECT
        column_name,ordinal_position,
        data_type,column_type,COUNT(1) rowcount
    FROM information_schema.columns
    WHERE table_schema='mydb'
    AND table_name IN ('product_today','product_yesterday')
    GROUP BY
        column_name,ordinal_position,
        data_type,column_type
    HAVING COUNT(1)=1
) A;

দুটি আলাদা ডেটাবেসে দুটি টেবিল

যদি আপনি জানতে চান db1.tb1এবং db2.tb2আলাদা হয় তবে এটি চালান

SELECT IF(COUNT(1)>0,'Differences','No Differences') Comparison FROM
(
    SELECT
        column_name,ordinal_position,
        data_type,column_type,COUNT(1) rowcount
    FROM information_schema.columns
    WHERE
    (
        (table_schema='db1' AND table_name='tb1') OR
        (table_schema='db2' AND table_name='tb2')
    )
    AND table_name IN ('product_today','product_yesterday')
    GROUP BY
        column_name,ordinal_position,
        data_type,column_type
    HAVING COUNT(1)=1
) A;

আপনার যদি আসলে পার্থক্যগুলি দেখতে হয় তবে এটি চালান

SELECT column_name,ordinal_position,data_type,column_type FROM
(
    SELECT
        column_name,ordinal_position,
        data_type,column_type,COUNT(1) rowcount
    FROM information_schema.columns
    WHERE
    (
        (table_schema='db1' AND table_name='tb1') OR
        (table_schema='db2' AND table_name='tb2')
    )
    AND table_name IN ('product_today','product_yesterday')
    GROUP BY
        column_name,ordinal_position,
        data_type,column_type
    HAVING COUNT(1)=1
) A;

একবার চেষ্টা করে দেখো !!!


আমার দুটি ডিভ ডাটাবেসের সাথে বিভিন্ন রাজ্যে একই টেবিলের পাশাপাশি তুলনা করতে হবে, আমি লক্ষ্যটি সুন্দরভাবে পূরণ করতে এটি পরিবর্তন করতে সক্ষম হয়েছি।
জেসন

1
@ জেসন খুশী আমি সাহায্য করতে পারলাম !!!
রোল্যান্ডোমাইএসকিউএলডিবিএ

খুব সহায়ক, আমাকে কিছু মূল্যবান সময় বাঁচিয়েছিল
নিকিতা কার্টিন

নির্বাচিত কলামগুলিতে স্কিমা নাম, টেবিলের নাম কীভাবে দেখানো যায়
আইকোডার

2

আপনি শো তৈরি টেবিল product_today এর আউটপুট চেকসাম তুলনা করতে পারেন

# mysql -NBe "SHOW CREATE TABLE sakila.actor"| sed -r 's/AUTO_INCREMENT=[0-9]+/AUTO_INCREMENT=XXX/g' | md5sum
# 1bc0d72b294d1a93ce01b9a2331111cc  -

1
যদি কোনও স্বতঃপরিচয় থাকে তবে এটি এটি পেতে পারে।
রোল্যান্ডোমাইএসকিউএলডিবিএ

ঠিক আছে, তারপরে আপনি স্বতঃসংশোধের মানটি
কেটেছেন

এখন, এটি দ্রুত এবং নোংরা। +1 !!!
রোল্যান্ডোমাইএসকিউএলডিবিএ

আপনি যদি শেল থেকে কাজ করে থাকেন তবে এটি একটি চতুর সমাধান বলে মনে হচ্ছে। ধন্যবাদ.
sjd

2
কলামগুলি একই ক্রমে থাকবে তার কোনও গ্যারান্টি নেই, সুতরাং নির্দিষ্ট বুদ্ধিমান অভিন্ন স্কিমগুলি বিভিন্ন চেকসাম তৈরি করতে পারে।
জেডএস

1

রোল্যান্ডোমাইএসকিউএলডিবিএর উত্তরে প্রসারিত:

পাশাপাশি টেবিলের নামটি দেখতে, এটি জিজ্ঞাসা করুন:

SELECT table_name, column_name,ordinal_position,data_type,column_type FROM
(
    SELECT
        table_name, column_name,ordinal_position,
        data_type,column_type,COUNT(1) rowcount
    FROM information_schema.columns
    WHERE table_schema=DATABASE()
    AND table_name IN ('table_1','table_2')
    GROUP BY
        column_name,ordinal_position,
        data_type,column_type
    HAVING COUNT(1)=1
) A;

0

তথ্য_স্কেমা - কলাম_ টাইপ ক্ষেত্রের কলামগুলির সারণীতে একবার দেখুন। এটি আপনাকে টেবিলের কাঠামোর তুলনা করতে দেয় allow


0

আমার 2 টি ডাটাবেস (ডিবি 1, ডিবি 2) তুলনা করার চূড়ান্ত উপায় - কেবল সারণী / দর্শন, সীমাবদ্ধতা এবং বিদেশী কী অন্তর্ভুক্ত নয়। আমার ক্ষেত্রে আমি উত্পাদনের সাথে ইউএটি বা ইউএএটির সাথে ডিএইভির সাথে তুলনা করতে সর্বদা নিম্নলিখিত এসকিউএল ব্যবহার করি।

ডিবি ডিআইএফএফ (সারণী / দর্শনগুলির তুলনা করুন)

select x.* from (
SELECT a.table_name, a.column_name,
    max(IF(b.TS='S1',b.ordinal_position,null)) as S1_ordinal_position,
    max(IF(b.TS='S2',b.ordinal_position,null)) as S2_ordinal_position,
    max(IF(b.TS='S1',b.data_type       ,null)) as S1_data_type,
    max(IF(b.TS='S2',b.data_type       ,null)) as S2_data_type,
    max(IF(b.TS='S1',b.column_type     ,null)) as S1_column_type,
    max(IF(b.TS='S2',b.column_type     ,null)) as S2_column_type
FROM
(SELECT DISTINCT table_name, column_name
 FROM information_schema.columns
 WHERE table_schema IN ('DB1','DB2')
) a
INNER JOIN
(SELECT IF(table_schema='DB1','S1','S2') as TS,
    table_schema,table_name,column_name,ordinal_position,data_type,column_type
 FROM information_schema.columns
 WHERE table_schema IN ('DB1','DB2')
) b
on (a.table_name = b.table_name and a.column_name = b.column_name)
group by a.table_name, a.column_name
) x
where x.S1_ordinal_position != x.S2_ordinal_position or x.S1_ordinal_position is null or x.S2_ordinal_position is null
or    x.S1_data_type        != x.S2_data_type
or    x.S1_column_type      != x.S2_column_type
ORDER BY x.table_name;

-2

দুটি ডাটাবেসের টেবিল কাঠামোর সমস্ত পরিবর্তনের জন্য:

SELECT table_schema, table_name, column_name,ordinal_position,data_type,column_type FROM (
    SELECT
        table_schema, table_name, column_name,ordinal_position,
        data_type,column_type,COUNT(1) rowcount
    FROM information_schema.columns
    WHERE table_schema IN ('database1', 'database2')
    GROUP BY
        column_name,ordinal_position,
        data_type,column_type
    HAVING COUNT(1)=1 ) A;

রেফ: .: RolandoMySQLDBA উত্তর থেকে


এই ঠিক কি? রোল্যান্ডোর উত্তরের উন্নতি?
ypercubeᵀᴹ

উন্নত নয় তবে দুটি ডাটাবেসের মধ্যে থাকা সমস্ত টেবিলের সরাসরি পরিবর্তন দেখতে।
মুর্তজা.ওভেদেব
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.