MySQL में दो तालिकाओं की संरचना की तुलना करने के लिए क्वेरी


18

मेरे एक MySQL डेटाबेस की बैकअप प्रक्रिया को स्वचालित करने के लिए, मैं दो तालिकाओं की संरचना (वर्तमान संस्करण बनाम पुराने संस्करण) की तुलना करना चाहूंगा।

क्या आप एक ऐसी क्वेरी के बारे में सोच सकते हैं जो दो तालिकाओं की तुलना कर सकती है?

यहां कुछ उदाहरण तालिकाएं हैं जिनकी आप तुलना कर सकते हैं।

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 यह मानकर कि मेरा प्रश्न SF के लिए पर्याप्त विषय पर है, यदि आपको ऐसा लगता है कि मैं यहां भी इसी तरह का उत्तर टाइप कर रहा हूं तो मैं इसे स्वीकार कर लूंगा। अन्यथा, मैं आज बाद में अपने स्वयं के प्रश्न का उत्तर दूंगा।

मुझे यकीन नहीं है कि अगर यह वहां फिट होता है, लेकिन मैं एक उत्तर लिखूंगा, क्योंकि यह किसी भी तरह से फिट हो सकता है, क्योंकि यह किसी भी तरह से एक सर्वर व्यवस्थापक से सवाल कर सकता है :) जैसा कि, अगर मैं तालिका संरचना के एक डंप के साथ जवाब दूंगा, और दोनों के बीच एक दरार, यह फिट होगा। यह मेरी अपनी राय में एक ग्रे लाइन है

1
यह मज़बूती से करना असंभव है। सॉफ्टवेयर संशोधन के बीच डेटा की संरचना में सभी परिवर्तन वास्तव में स्कीमा में परिवर्तन के रूप में प्रकट नहीं होते हैं। केवल एप्लिकेशन के डेवलपर्स को पता है कि वास्तव में क्या बदल गया है। यदि डेवलपर्स ने आपको माइग्रेशन के लिए कोई आधिकारिक टूल नहीं दिया है, तो आपको उनसे यह पूछना होगा कि एप्लिकेशन के विशिष्ट संस्करणों के बीच कैसे माइग्रेट किया जाए।
कास्परड

1
मैंने एक निशुल्क उपकरण बनाया, जो दूसरे तालिका को पहले एक tablediff.com के समान बनाने के लिए परिवर्तन कथनों को उत्पन्न करेगा । अभी भी अल्फा।
Mihai

जवाबों:


35

दो दिन के अंतराल में दो बच्चे

यदि आप जानना चाहते हैं कि क्या दो टेबल अलग हैं, तो इसे चलाएं

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;

दो अलग अलग DATABASES में दो टैब

यदि आप जानना चाहते हैं कि क्या 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
@ जेसन खुश मैं मदद कर सकता है !!!
रोलैंडमाइसीडीडीबीए

बहुत मददगार, मुझे कुछ कीमती समय बचा लिया
निकिता कर्टिन

स्कीमा नाम, तालिका नामों को स्तंभों में कैसे दिखाया जाए
iCoders

2

आप SHOW CREATE TABLE product_today के आउटपुट के चेकसम की तुलना कर सकते हैं

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

1
यदि कोई AUTO_INCREMENT है, तो वह इसे प्राप्त कर सकता है।
रोलैंडमाइसीडीडीबीए

ठीक है, तो आप
स्व-

अब, यह जल्दी और गंदा है। +1 !!!
रोलैंडमाइसीडीडीबीए

यदि आप शेल से काम कर रहे हैं तो यह एक चतुर समाधान लगता है। धन्यवाद।
sjdh

2
इस बात की कोई गारंटी नहीं है कि कॉलम एक ही क्रम में होंगे, इसलिए विशिष्ट-वार समान स्कीमा विभिन्न चेकसम का उत्पादन कर सकते हैं।
ZDS

1

RolandoMySQLDBA के उत्तर पर विस्तार:

तालिका नाम को भी देखने के लिए, इसे क्वेरी करें:

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

कॉलम_टाइप - info_schema में कॉलम तालिका पर एक नज़र डालें। यह आपको टेबल संरचनाओं की तुलना करने की अनुमति देगा।


0

2 डेटाबेस (DB1, DB2) की तुलना करने का मेरा अंतिम तरीका - तालिकाओं / विचार केवल, बाधाएं और विदेशी कुंजी शामिल नहीं हैं। मेरे मामले में मैं हमेशा डीएवी के साथ यूएटी या यूएटी के साथ उत्पादन की तुलना करने के लिए एसक्यूएल का उपयोग करता हूं।

डीबी डीआईएफएफ (तालिकाओं / विचारों की तुलना करें)

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;

रेफरी: रोलांडोमीक्यूडीबीए एन्स से


वास्तव में यह क्या है? रोलैंडो के जवाब में सुधार?
ypercube y

दो डेटाबेस के बीच सभी तालिकाओं में प्रत्यक्ष परिवर्तन देखने के लिए सुधार नहीं किया गया है।
मुर्तजा.देव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.