在不知道表名的情况下更新多个表(由于外键关系链)

时间:2014-07-29 20:10:26

标签: sql sql-server

我需要在一个表中为一些行更新一个字段(比如Table_A)。但是,我收到一条错误消息conflict with the Foreign Key Constraint in Table_B

所以,我也尝试更新Table_B,结果表明Table_B具有Foreign Key Constraint与Table_C和Table_D;再次,我试图更新Table_C和D,结果发现它们与table_E,F,G,H,I,J,K等等相互冲突。

我被告知这样的"链"可以达到20多个表。

此外,我无法访问数据库架构,因此我很难确定哪个field哪个表是另一个表的foreign key

目前,我所能做的就是使用错误消息中显示的表中的select *语句从A-Z手动检查每个表。我想知道是否有任何替代方案可以直接更新表A(直到最后一个表格)中的这些特定字段?

我正在使用SQL Server 2005。

1 个答案:

答案 0 :(得分:2)

这将为您提供外键中表和列的名称

SELECT 
  OBJECT_NAME(fk.[constraint_object_id])    AS [foreign_key_name]
 ,OBJECT_SCHEMA_NAME(fk.[parent_object_id]) AS [parent_schema_name]
 ,OBJECT_NAME(fk.[parent_object_id])        AS [parent_table_name]
 ,pc.[name]                                 AS [parent_column_name]
 ,OBJECT_SCHEMA_NAME(fk.[parent_object_id]) AS [referenced_schema_name]
 ,OBJECT_NAME(fk.[referenced_object_id])    AS [referenced_table_name]
 ,rc.[name]                                 AS [referenced_column_name]
FROM [sys].[foreign_key_columns] fk
INNER JOIN [sys].[columns] pc ON 
  pc.[object_id] = fk.[parent_object_id] AND
  pc.[column_id] = fk.[parent_column_id]
INNER JOIN [sys].[columns] rc ON
  rc.[object_id] = fk.[referenced_object_id] AND
  rc.[column_id] = fk.[referenced_column_id]

如何最好地显示和分析连接图是一个更主观的问题,并将取决于您的架构的复杂性。