我有3个不同的sql环境,它们相似但不相同。我在不同的表中使用了一列“CLMID”。其中大多数都与外键映射相关联。但是有些表已损坏,因此没有正确完成外键映射。我现在需要在所有表中将数据更新到此列。所以我需要一个查询,它会为我找到具有正确映射的表的列表,这样如果我更新父级,他们就会自己更新子级。我还需要以另一种方式找到约束,只有在我更新子项时我才能更新父表。
请注意,我需要获取此列表而不进行任何更新或插入操作作为其关键数据库。请帮我查询一下。谢谢。
答案 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列感兴趣。据我所知,没有办法更新子表并让更新自动传播到父表。不过,我愿意纠正。