2011-06-20 35 views
0

我有3個不同的SQL環境,它們是相似但不相同的。我在不同的表中使用了一列「CLMID」。他們中的大多數都與外鍵映射關聯。但是有些表已損壞,因此沒有正確完成外鍵映射。我現在需要將數據更新到所有表中的這一列。所以我需要一個查詢,它將爲我找到具有正確映射的表的列表,以便如果我更新父項,它們會自己更新子項。我還需要以另一種方式查找約束,只有當我更新孩子時,我才能更新父表。如何跟蹤外鍵?

請注意,我需要獲取此列表而不進行任何更新或插入操作作爲其關鍵數據庫。請幫助我查詢。謝謝。

回答

2

每個SQL產品都有一些方法來查詢數據庫的模式數據,包括密鑰。學習使用Information_Schema是最好的恕我直言,因爲它是大多數平臺的標準(我記得Oracle沒有實現它)。

SQL Server可能有一些更簡單的查詢與自己的目錄,但下面有點毛毛茸茸的查詢給你正是你想要的,並且是你可以得到的最多的跨平臺。

SELECT 
    FK.TABLE_NAME as child_table, 
    CU.COLUMN_NAME as child_column, 
    PK.TABLE_NAME as parent_table, 
    PT.COLUMN_NAME as parent_column, 
    C.CONSTRAINT_NAME 
FROM 
INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C 
INNER JOIN 
INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK 
    ON C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME 
INNER JOIN 
INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK 
    ON C.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME 
INNER JOIN 
INFORMATION_SCHEMA.KEY_COLUMN_USAGE CU 
    ON C.CONSTRAINT_NAME = CU.CONSTRAINT_NAME 
INNER JOIN 
( 
    SELECT 
     i1.TABLE_NAME, i2.COLUMN_NAME 
    FROM 
     INFORMATION_SCHEMA.TABLE_CONSTRAINTS i1 
     INNER JOIN 
     INFORMATION_SCHEMA.KEY_COLUMN_USAGE i2 
     ON i1.CONSTRAINT_NAME = i2.CONSTRAINT_NAME 
     WHERE i1.CONSTRAINT_TYPE = 'PRIMARY KEY' 
) PT 
ON PT.TABLE_NAME = PK.TABLE_NAME 
ORDER BY 
1,2,3,4 
+0

非常感謝。這很有幫助。 – Vinodtiru

0

試試這個

show create table table-name 

見狀,你可以看到外鍵的列有。這並沒有改變任何表數據

0

檢出sys.foreign_keys以執行某些特定於SQL Server的操作。具體來說,您似乎對delete_referential_action_desc和update_referential_action_desc列感興趣。據我所知,沒有辦法更新子表並讓更新自動傳播到父級。不過,我願意改正。