我正在尝试使用ADO.NET 4检索数据库中所有表的主键元数据。
GetSchema()方法允许您下载大量元数据,包括索引和外键,但是没有任何内容可以识别主键。对我来说这似乎是一个明显的遗漏,我认为必须是我缺少一些东西!
从我能够找到的,似乎有两个'变通方法'(至少对于SQL Server):
有人可以告诉我是否有一种干净的标准方法来识别数据库中的所有主键并检索其元数据,这些元数据将适用于所有数据提供程序实现(包括Oracle,DB2,MySql)?
答案 0 :(得分:2)
您可以从information_schema.table_constraints
:
select c.constraint_name, c.table_name, k.column_name
from information_schema.table_constraints as c
join information_schema.key_column_usage as k
on c.constraint_catalog = k.constraint_catalog
and c.constraint_schema = k.constraint_schema
and c.constraint_name = k.constraint_name
where c.constraint_type = 'primary key'
and c.table_name = 'YourTable'
答案 1 :(得分:1)
GetSchema上的MSDN页面和集合PrimaryKeys
。但它不适用于SQL Server,正如它在顶部所说的那样
某些架构集合不完整,例如SQL Server,它不包含主键集合。
事实上,读取它意味着GetSchema作为跨数据库模式检索的手段并不可靠。
大多数主要RDBMS支持的另一个选项是查询所有主键的information_schema。
select *
from information_schema.TABLE_CONSTRAINTS
where CONSTRAINT_TYPE = 'PRIMARY KEY'
您可以按位置顺序
将此连接到KEY_COLUMN_USAGEselect PK.TABLE_SCHEMA, PK.TABLE_NAME, C.ORDINAL_POSITION, C.COLUMN_NAME
from information_schema.TABLE_CONSTRAINTS PK
inner join information_schema.KEY_COLUMN_USAGE C
on C.TABLE_SCHEMA = PK.TABLE_SCHEMA
and C.TABLE_CATALOG = PK.TABLE_CATALOG
and C.TABLE_NAME = PK.TABLE_NAME
where PK.CONSTRAINT_TYPE = 'PRIMARY KEY'
请注意,尽管information_schema具有良好的支持,但它可能在很小的方面有所不同。在SQL Server中,table_catalog(= db name)始终限制为当前db,而在MySQL中,它将从任何目录(db)返回表,因此您可能需要一个目录过滤器才能准确。
答案 2 :(得分:1)
是否有统一的API来获取所有后端的所有元数据(包括主键信息) - 答案为“否”
理想情况下,每个后端的DbConnection.GetSchema覆盖应提供各种集合以获取所有可能的元数据,但遗憾的是并非如此。我通常按顺序使用以下方法
对于Sql Server 2005及更高版本,我使用了系统存储过程 - sys.sp_primary_keys_rowset2
如果需要,我也会提供其他后端的信息。
答案 3 :(得分:0)
有一个库Kailua - The forgotten methods in the ADO.NET API. ,它为前5个供应商提供了这个和其他元数据。此信息是特定于供应商的。