如何追踪外键?

时间:2011-06-20 02:17:43

标签: sql sql-server sql-server-2005 sql-server-2008

我有3个不同的sql环境,它们相似但不相同。我在不同的表中使用了一列“CLMID”。其中大多数都与外键映射相关联。但是有些表已损坏,因此没有正确完成外键映射。我现在需要在所有表中将数据更新到此列。所以我需要一个查询,它会为我找到具有正确映射的表的列表,这样如果我更新父级,他们就会自己更新子级。我还需要以另一种方式找到约束,只有在我更新子项时我才能更新父表。

请注意,我需要获取此列表而不进行任何更新或插入操作作为其关键数据库。请帮我查询一下。谢谢。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

试试这个

show create table table-name

看到这个后,您可以看到列所具有的外键。这不会改变任何表数据

答案 2 :(得分:0)

检查sys.foreign_keys以获取某些特定于SQL Server的操作。具体来说,您似乎对delete_referential_action_desc和update_referential_action_desc列感兴趣。据我所知,没有办法更新子表并让更新自动传播到父表。不过,我愿意纠正。