我有3個不同的SQL環境,它們是相似但不相同的。我在不同的表中使用了一列「CLMID」。他們中的大多數都與外鍵映射關聯。但是有些表已損壞,因此沒有正確完成外鍵映射。我現在需要將數據更新到所有表中的這一列。所以我需要一個查詢,它將爲我找到具有正確映射的表的列表,以便如果我更新父項,它們會自己更新子項。我還需要以另一種方式查找約束,只有當我更新孩子時,我才能更新父表。如何跟蹤外鍵?
請注意,我需要獲取此列表而不進行任何更新或插入操作作爲其關鍵數據庫。請幫助我查詢。謝謝。
我有3個不同的SQL環境,它們是相似但不相同的。我在不同的表中使用了一列「CLMID」。他們中的大多數都與外鍵映射關聯。但是有些表已損壞,因此沒有正確完成外鍵映射。我現在需要將數據更新到所有表中的這一列。所以我需要一個查詢,它將爲我找到具有正確映射的表的列表,以便如果我更新父項,它們會自己更新子項。我還需要以另一種方式查找約束,只有當我更新孩子時,我才能更新父表。如何跟蹤外鍵?
請注意,我需要獲取此列表而不進行任何更新或插入操作作爲其關鍵數據庫。請幫助我查詢。謝謝。
每個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
試試這個
show create table table-name
見狀,你可以看到外鍵的列有。這並沒有改變任何表數據
檢出sys.foreign_keys以執行某些特定於SQL Server的操作。具體來說,您似乎對delete_referential_action_desc和update_referential_action_desc列感興趣。據我所知,沒有辦法更新子表並讓更新自動傳播到父級。不過,我願意改正。
非常感謝。這很有幫助。 – Vinodtiru