Q
撤消重複的外鍵
8
A
回答
10
我在這裏使用這個T-SQL腳本來檢測可能重複FK約束 - 它也產生在最後的輸出列的必要ALTER TABLE...DROP CONSTRAINT
語句。
不能可靠地自動檢測並選擇其中多個FK約束下降 - 所以你基本上離開探測到它們,然後手動挑選下降哪些(使用我的查詢產生的壓降語句)。
;WITH FKData AS
(
SELECT
fk.parent_object_id,
fkc.parent_column_id,
fk.referenced_object_id,
fkc.referenced_column_id,
FKCount = COUNT(*)
FROM
sys.foreign_keys fk
INNER JOIN
sys.foreign_key_columns fkc ON fkc.constraint_object_id = fk.object_id
GROUP BY
fk.parent_object_id, fkc.parent_column_id, fk.referenced_object_id, fkc.referenced_column_id
HAVING
COUNT(*) > 1
),
DuplicateFK AS
(
SELECT
FKName = fk.Name,
ParentSchema = s1.Name,
ParentTable = t1.Name,
ParentColumn = c1.Name,
ReferencedTable = t2.Name,
ReferencedColumn = c2.Name
FROM
sys.foreign_keys fk
INNER JOIN
sys.foreign_key_columns fkc ON fkc.constraint_object_id = fk.object_id
INNER JOIN
FKData f ON fk.parent_object_id = f.parent_object_id
AND fk.referenced_object_id = f.referenced_object_id
AND fkc.parent_column_id = f.parent_column_id
AND fkc.referenced_column_id = f.referenced_column_id
INNER JOIN
sys.tables t1 ON f.parent_object_id = t1.object_id
INNER JOIN
sys.columns c1 ON f.parent_object_id = c1.object_id AND f.parent_column_id = c1.column_id
INNER JOIN
sys.schemas s1 ON t1.schema_id = s1.schema_id
INNER JOIN
sys.tables t2 ON f.referenced_object_id = t2.object_id
INNER JOIN
sys.columns c2 ON f.referenced_object_id = c2.object_id AND f.referenced_column_id = c2.column_id
)
SELECT
FKName,
ParentSchema, ParentTable, ParentColumn,
ReferencedTable, ReferencedColumn,
DropStmt = 'ALTER TABLE ' + ParentSchema + '.' + ParentTable +
' DROP CONSTRAINT ' + FKName
FROM
DuplicateFK
2
對於100的表,那麼是不是一種選擇,但如果你只有幾桌,請在SQL Server Management Studio中的示意圖,其中添加表那裏,視覺上刪除受騙者。
0
這將刪除最近創建的副本
;WITH fkeys AS (
SELECT f.object_id ,
f.name ,
f.parent_object_id,
ROW_NUMBER() OVER(PARTITION BY t.column_names ORDER BY f.create_date,f.[object_id]) AS RowNum
FROM sys.foreign_keys f
CROSS APPLY (SELECT fc.parent_object_id,parent_column_id,fc.referenced_object_id ,fc.referenced_column_id
FROM sys.foreign_key_columns fc
WHERE fc.constraint_object_id = f.object_id
ORDER BY constraint_column_id
FOR XML PATH('')
) t (column_names)
)
SELECT 'ALTER TABLE '+QUOTENAME(OBJECT_SCHEMA_NAME(f.parent_object_id)) + '.'+QUOTENAME(OBJECT_NAME(f.parent_object_id)) +' DROP CONSTRAINT '+QUOTENAME(f.name)+';' AS DropStatement
FROM fkeys f
WHERE f.RowNum >= 2
相關問題
- 1. 撤消重做RichTextBox中使用撤消和恢復功能
- 2. 自定義撤消重複的RichTextBox
- 3. 重複的外鍵
- 4. 撤消bzr恢復
- 5. jQuery的複選框撤消
- 6. 有重複的外鍵和無主鍵
- 7. 撤消jQuery或恢復DOM?
- 8. 撤消後觸發重做
- 9. MVVM光和撤消/重做?
- 10. TextBox撤消/重做命令
- 11. 撤消/重置AllowSetForegroundWindow()調用
- 12. 撤消和重做畫布
- 13. 撤消「混帳重置--merge」
- 14. 撤消vim中的ESC鍵擊
- 15. ios撤消管理器 - 重置爲第一個撤消
- 16. 重複插入主鍵,外鍵
- 17. 刷卡撤消像gmail的撤消
- 18. MySQL:消除重複行而不破壞外鍵約束
- 19. 撤消git的復位HEAD〜3
- 20. 撤消--no-恢復中的R
- 21. IOS 8:自定義鍵盤與撤消和重做按鈕
- 22. 意外地'重新焊接',如何撤消長時間休息?
- 23. 撤消意外獲取遠程重新分區
- 24. MySQL的外鍵重複插入忽略
- 25. CodeFirst生成重複的外鍵 - EntityFramework
- 26. 標準化 - 正在重複的外鍵
- 27. 可保存重複值的外鍵
- 28. 複合外鍵的雙重使用
- 29. Android的位圖撤消重做影響
- 30. 撤消git的MV(重命名)
優秀謝謝!! – peter 2012-03-23 21:58:44
有沒有辦法讓我們獲得模式名稱?因爲很少有不屬於dbo模式的。 ! – peter 2012-03-23 22:02:14
@Peter:** ** SURE更新我的迴應包括父模式(你可以得到引用的模式,也如果需要的話 - 但你並不需要,對於DROP語句) – 2012-03-23 22:06:22