多数据库学习之SQL Server查询表自增主键字段信息SQL
- 前言
- 概念
- SQL样例
- 方式一:系统内置存储过程查找
- 方式二:通过INFORMATION_SCHEMA模式下系统视图获取
- 方式三:通过sys模式下系统视图获取
- 参考链接
前言
-
Microsoft SQL Server简介
Microsoft SQL Server 服务由一个实例(Instance)和多个数据库(Databases)组成,一个数据库有多个架构(Schema),另外用户和架构是多对多的关系。实例包含了后台线程和占用的内存,默认的系统数据库包括 master、model、msdb 以及 tempdb。
-
需求说明
实际开发中需要根据表主键字段批量更新数据,从而避免全表扫描,加快数据库操作速度。在获取表结构时,提前查询表主键信息,根据主键作为条件拼接,完成批量操作。
概念
-
主键
表中经常有一个列或多列的组合,其值能唯一地标识表中的每一行,这样的一列或多列称为表的主键。通过它可强制表的实体完整性,一个表只能有一个 PRIMARY KEY 约束,而且 PRIMARY KEY 约束中的列不能接受空值。由于 PRIMARY KEY 约束确保唯一数据,所以经常用来定义标识列。
SQL样例
方式一:系统内置存储过程查找
EXEC sp_pkeys @table_name='table_name',@table_owner = 'schema_name'
方式二:通过INFORMATION_SCHEMA模式下系统视图获取
SELECT
TABLE_SCHEMA,
TABLE_NAME,
COLUMN_NAME,
ORDINAL_POSITION
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_NAME = 'table_name'
AND TABLE_SCHEMA = 'schema_name'
方式三:通过sys模式下系统视图获取
-- 样例一
select s.name as TABLE_SCHEMA,
t.name as TABLE_NAME,
k.name as CONSTRAINT_NAME,
c.name as COLUMN_NAME,
c.is_identity as IS_IDENTITY,
typ.name AS DATA_TYPE,
ic.key_ordinal AS ORDINAL_POSITION
from sys.key_constraints as k -- 主键信息
join sys.tables as t on t.object_id = k.parent_object_id -- 获取表名
join sys.schemas as s on s.schema_id = t.schema_id -- 获取数据库名
join sys.index_columns as ic on ic.object_id = t.object_id and ic.index_id = k.unique_index_id -- 获取key顺序
join sys.columns as c on c.object_id = t.object_id and c.column_id = ic.column_id -- 获取列名称
LEFT JOIN sys.types typ ON typ.system_type_id = c.system_type_id -- 列类型
where k.type = 'PK'
AND s.name = 'schema_name'
AND t.name = 'table_name';
-- 样例二
select o.name as TABLE_NAME,
c.name as COLUMN_NAME,
COLUMNPROPERTY(c.id, c.name, 'IsIdentity') as IS_IDENTITY,
k.colid as COLUMN_POSITION,
k.keyno as ORDINAL_POSITION
from sys.sysindexes i
join sys.sysindexkeys k on i.id = k.id and i.indid = k.indid
join sys.sysobjects o on i.id = o.id
join sys.syscolumns c on i.id = c.id and k.colid = c.colid
LEFT JOIN sys.objects s ON o.id = s.object_id
where o.xtype = 'U'
and exists(select 1 from sys.sysobjects where xtype = 'PK' and name = i.name)
AND SCHEMA_NAME(s.schema_id) IN ('schema_name')
AND o.name = 'table_name';
参考链接
-
SQL Server查询表主键的方法
-
四种找到SqlServer主键的方法
-
SQL Server technical documentation
-
Microsoft SQL Server 数据库体系结构图解