【问题标题】:Update multiple table without knowing the table name (due to a chain of Foreign key relationship)在不知道表名的情况下更新多个表(由于外键关系链)
【发布时间】:2014-07-30 05:18:40
【问题描述】:

我需要为一张表中的几行更新一个字段(例如,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

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

我使用的是 SQL Server 2005。

【问题讨论】:

  • 为什么看不到表架构?你能查询外键DMV吗?从 sys.foreign_key_columns 中选择 *
  • 它给了我constraint object idconstraint column idparent object idparent column id 等等,只是一堆数字。我如何从中确定?
  • 你必须从 parent_object_id 开始。这将是您开始使用的表的 ObjectID。那么referenced_object_id就是带有外键的表的object_id。可以通过查看 sys.columns 来确定父级和引用的 column_id。放在一起查找与给定表相关的所有外键约束并不是一个简单的查询。这是(或至少可以)递归的。这就是为什么如果您查看数据库的架构会容易得多。
  • 这是该 DMV 的 BOL 条目。 msdn.microsoft.com/en-us/library/ms186306.aspx

标签: sql sql-server


【解决方案1】:

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

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]

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

【讨论】:

    猜你喜欢
    • 2011-07-29
    • 2018-12-11
    • 1970-01-01
    • 2013-07-26
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 2013-12-27
    • 2013-03-15
    相关资源
    最近更新 更多