2017-05-03 19 views
9

Tablo A yabancı anahtar kısıtlamasını (tip) sahiptir Tablolar Arasında yabancı anahtar kısıtlaması Sütun bilgiler bulun. Ancak, tür boş değil ve kimliği null.Tablo B (id) için

Yabancı anahtar kısıtlamalarına bakacak ve eşitlenip eşleşmediğini görmek için sütun türlerini ve null sütunları eşleştirecek olan information_schema kullanarak bir sorgu oluşturmaya çalışıyorum, ancak mantıkla ilgili sorunlar yaşıyorum.

select kcu.table_name, kcu.column_name, c.column_type, c.is_nullable,kcu.referenced_table_name, kcu.referenced_column_name,c.column_type, c.is_nullable 
from key_column_usage kcu 
inner join columns c on c.table_schema=kcu.table_schema and c.column_name=kcu.column_name and c.table_name=kcu.table_name 
where kcu.referenced_table_name='Table_B' and kcu.table_name='Table_A'; 

Bu sözdiziminin yanlış olduğunu biliyorum - bu, şimdiye kadar bir araya getirdiğim tek şey. Bunun bir veritabanındaki her tablo için çalıştırılabilmesini ve tablo_adı, ardından sütun_adıyla sipariş vermesini istiyorum. Column_type ve is_nullable alanlarının aynı olduğu sütunları hariç tutabilir.

cevap

5

yabancı kısıtlamasının bir tarafta NULLABLE sütun için geçerli nedenler olabilir, ancak bu ilgili sütun türü/null özelliklerini karşılaştırır.

SELECT 
     kcu.constraint_schema 
    , kcu.constraint_name 
    , kcu.referenced_table_name 
    , kcu.referenced_column_name 
    , kcu.table_name 
    , kcu.column_name 
    , refcol.column_type referenced_column_type 
    , childcol.column_type 
    , refcol.is_nullable referenced_is_nullable 
    , childcol.is_nullable 

FROM information_schema.key_column_usage kcu 
INNER JOIN information_schema.columns refcol 
     ON refcol.table_schema = kcu.referenced_table_schema 
     AND refcol.table_name = kcu.referenced_table_name 
     AND refcol.column_name = kcu.referenced_column_name 
INNER JOIN information_schema.columns childcol 
     ON childcol.table_schema = kcu.table_schema 
     AND childcol.table_name = kcu.table_name 
     AND childcol.column_name = kcu.column_name 

WHERE (
     refcol.is_nullable <> childcol.is_nullable 
     OR 
     refcol.column_type <> childcol.column_type 
    ) 
AND kcu.TABLE_SCHEMA = 'rextester' #change this value to suit 
ORDER BY 
     kcu.table_name 
    , kcu.column_name 
; 

See a working example (click the run button)

+0

'refcol.column_type <> childcol.column_type' - Bunun mümkün olmaması gerektiğini düşünüyorum. –

+0

@Paul Spiegel uyumsuz veri tipleri ile ilgili olarak durum istendi. –