Sar*_*nan 5 sql-server-2008 foreign-key database-design sql-server metadata
我想使用 2 个查询,一个列出具有以下信息的给定表的所有外键,Schema name, foreign table name另一个列出所有主键。
这个列出主键的查询是否正确:
select syssc.name as schemaname , cast(c.name as varchar(255)) as foreign_table ,
cast(p.name as varchar(255)) as primary_table
from sysobjects f
inner join sysobjects c on f.parent_obj = c.id
inner join sysreferences r on f.id = r.constid
inner join sysobjects p on r.rkeyid = p.id
inner join syscolumns rc on r.rkeyid = rc.id and r.rkey1 = rc.colid
inner join syscolumns fc on r.fkeyid = fc.id and r.fkey1 = fc.colid
left join syscolumns rc2 on r.rkeyid = rc2.id and r.rkey2 = rc.colid
left join syscolumns fc2 on r.fkeyid = fc2.id and r.fkey2 = fc.colid
inner join sys.tables syst on rc.id=syst.object_id
inner join sys.schemas syssc on syst.schema_id=syssc.schema_id
where f.type = 'F' AND c.name in ('table name' )
Run Code Online (Sandbox Code Playgroud)
这是我现在用来获取外键的查询
select syssc.name as schemaname ,cast(c.name as varchar(255)) as foreign_table ,
cast(p.name as varchar(255)) as primary_table
from sysobjects f
inner join sysobjects c on f.parent_obj = c.id
inner join sysreferences r on f.id = r.constid
inner join sysobjects p on r.rkeyid = p.id
inner join syscolumns rc on r.rkeyid = rc.id and r.rkey1 = rc.colid
inner join syscolumns fc on r.fkeyid = fc.id and r.fkey1 = fc.colid
left join syscolumns rc2 on r.rkeyid = rc2.id and r.rkey2 = rc.colid
left join syscolumns fc2 on r.fkeyid = fc2.id and r.fkey2 = fc.colid
inner join sys.tables syst on rc.id=syst.object_id
inner join sys.schemas syssc on syst.schema_id=syssc.schema_id
where f.type = 'F' and p.name in ('table name')
Run Code Online (Sandbox Code Playgroud)
请检查这些查询是否正确和有效。
Aar*_*and 10
您应该熟悉新的目录视图。旧的 sysobjects、syscolumns 等已被弃用,仅出于向后兼容性原因提供 - 它们不应用于新开发,旧代码最终应过渡到新对象。
这是一个查询,它将获取涉及外键的列的两侧:
SELECT
constraint_name = OBJECT_NAME(fkc.constraint_object_id),
foreign_schema = SCHEMA_NAME(child.[schema_id]),
foreign_table = child.name,
foreign_column = child_cols.name,
referenced_schema = SCHEMA_NAME(referenced.[schema_id]),
referenced_table = referenced.name,
referenced_column = referenced_cols.name
FROM sys.foreign_key_columns AS fkc
INNER JOIN sys.tables AS child
ON fkc.parent_object_id = child.[object_id]
INNER JOIN sys.tables AS referenced
ON fkc.referenced_object_id = referenced.[object_id]
INNER JOIN sys.columns AS referenced_cols
ON fkc.parent_column_id = referenced_cols.column_id
AND referenced_cols.[object_id] = referenced.[object_id]
INNER JOIN sys.columns AS child_cols
ON fkc.referenced_column_id = child_cols.column_id
AND child_cols.[object_id] = child.[object_id]
WHERE referenced.name = 'table name'
-- if you want the tables that a child table references, use this instead:
-- WHERE child.name = 'table name'
ORDER BY fkc.parent_column_id;
Run Code Online (Sandbox Code Playgroud)
而这个要简单得多,仅针对所涉及的表:
SELECT
constraint_name = name,
foreign_schema = OBJECT_SCHEMA_NAME(parent_object_id),
foreign_table = OBJECT_NAME(parent_object_id),
referenced_schema = OBJECT_SCHEMA_NAME(referenced_object_id),
referenced_table = OBJECT_NAME(referenced_object_id)
FROM sys.foreign_keys
WHERE OBJECT_NAME(referenced_object_id) = 'table name'
-- if you want the tables that a child table references, use this instead:
-- WHERE OBJECT_NAME(parent_object_id) = 'table name';
Run Code Online (Sandbox Code Playgroud)
编辑添加一些指向文档的链接(这些链接主要属于 SQL Server 2008 R2 层次结构,但它们也大致等同于 SQL Server 2008):
| 归档时间: |
|
| 查看次数: |
14064 次 |
| 最近记录: |