2017-05-03 11 views
9

Bảng A có ràng buộc khóa ngoài (loại) đến Bảng B (id). Tuy nhiên, loại không phải là null và id là nullable.Tìm thông tin cột hạn chế khóa ngoài giữa các bảng

Tôi đang cố gắng tạo truy vấn bằng cách sử dụng information_schema sẽ xem xét các ràng buộc khóa ngoài và khớp các loại cột và cột không thể xem để xem chúng có đồng bộ hay không, tuy nhiên tôi đang gặp sự cố với logic.

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

Tôi biết cú pháp này là không chính xác - đây chỉ là tất cả những gì tôi đã có thể kết hợp cho đến thời điểm này. Tôi muốn có điều này có thể được thực hiện cho mỗi bảng trong một cơ sở dữ liệu và có nó theo thứ tự của table_name, sau đó column_name. Nó có thể loại trừ các cột trong đó các trường column_type và is_nullable giống hệt nhau.

Trả lời

5

Có thể có lý do chính đáng cho cột NULLABLE ở một bên của ràng buộc nước ngoài, nhưng điều này sẽ so sánh các thuộc tính loại/nullable của các cột có liên quan.

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' - Tôi nghĩ rằng không nên có thể. –

+0

@Paul Spiegel liên quan đến các loại dữ liệu không khớp với điều kiện đã được yêu cầu. –

Các vấn đề liên quan