如何在sql server数据库中列出所有FK?
答案 0 :(得分:103)
我使用这个声明,似乎工作得很好。
SELECT RC.CONSTRAINT_NAME FK_Name
, KF.TABLE_SCHEMA FK_Schema
, KF.TABLE_NAME FK_Table
, KF.COLUMN_NAME FK_Column
, RC.UNIQUE_CONSTRAINT_NAME PK_Name
, KP.TABLE_SCHEMA PK_Schema
, KP.TABLE_NAME PK_Table
, KP.COLUMN_NAME PK_Column
, RC.MATCH_OPTION MatchOption
, RC.UPDATE_RULE UpdateRule
, RC.DELETE_RULE DeleteRule
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS RC
JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE KF ON RC.CONSTRAINT_NAME = KF.CONSTRAINT_NAME
JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE KP ON RC.UNIQUE_CONSTRAINT_NAME = KP.CONSTRAINT_NAME
答案 1 :(得分:10)
理论上讲,这很难。关系模型允许任何字段与任何其他字段相关。实际使用的是由可以使用的所有可能的SELECT语句定义的。
实际上,它取决于包含FK定义的表的数量。如果有人打算仔细定义所有FK引用 - 并且SELECT语句遵守这些规则 - 您可以查询它们。
但是,由于SELECT语句可以加入任何内容,因此除非您还拥有所有 SELECT语句,否则无法保证您拥有所有 FK。
修改强>
SELECT f.name AS ForeignKey,
OBJECT_NAME(f.parent_object_id) AS TableName,
COL_NAME(fc.parent_object_id, fc.parent_column_id) AS ColumnName,
OBJECT_NAME (f.referenced_object_id) AS ReferenceTableName,
COL_NAME(fc.referenced_object_id, fc.referenced_column_id) AS ReferenceColumnName
FROM sys.foreign_keys AS f
INNER JOIN sys.foreign_key_columns AS fc
ON f.OBJECT_ID = fc.constraint_object_id
可能会为你工作。
答案 2 :(得分:7)
我使用http://technet.microsoft.com/en-us/library/ms189807.aspx
SELECT * FROM sys.foreign_keys
即如果您至少使用SQL Server 2005+并希望查看FK名称列表。
但你可能想要了解更多关于相关表格的信息,不是吗,这就是答案的用武之地。
答案 3 :(得分:1)
这是一种更具信息性的呈现方式
SELECT DISTINCT PARENT_TABLE =
RIGHT(Replace(TC.constraint_name, 'FK_', ''),
Len(Replace(TC.constraint_name, 'FK_', '')) - Charindex('_', Replace(TC.constraint_name, 'FK_', ''))),
CHILD_TABLE = TC.table_name,
CU.column_name,
TC.constraint_name,
TC.constraint_type
FROM information_schema.table_constraints TC
INNER JOIN information_schema.constraint_column_usage CU
ON TC.constraint_name = CU.constraint_name
WHERE TC.constraint_type LIKE '%foreign'
OR TC.constraint_type LIKE '%foreign%'
OR TC.constraint_type LIKE 'foreign%'
答案 4 :(得分:0)
select * from sys.objects where type = 'F'