2017-05-03 64 views
9

表A對錶B(id)具有外鍵約束(類型)。但是,類型不爲null,id可以爲空。查找表之間的外鍵約束列信息

我想使用information_schema來構建一個查詢,它將查看外鍵約束並匹配列類型和可空列來查看它們是否同步,但是我遇到了邏輯問題。

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'; 

我知道這個語法是不正確的 - 這只是我迄今爲止能夠放在一起的所有東西。我希望能夠爲數據庫中的每個表執行此操作,並通過table_name和column_name對其進行排序。它可以排除column_type和is_nullable字段相同的列。

回答

5

在外部約束的一邊有NULLABLE列可能是合法的原因,但是這會比較所涉及列的類型/可空屬性。

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' - 我認爲這應該是不可能的。 –

+0

@Paul Spiegel關於請求條件不匹配的數據類型。 –