多数据库学习之SQL Server查询表自增主键字段信息SQL

前言

  • Microsoft SQL Server简介

    Microsoft SQL Server 服务由一个实例(Instance)和多个数据库(Databases)组成,一个数据库有多个架构(Schema),另外用户和架构是多对多的关系。实例包含了后台线程和占用的内存,默认的系统数据库包括 master、model、msdb 以及 tempdb。
    Microsoft SQL Server 的整体系统结构

  • 需求说明

    实际开发中需要根据表主键字段批量更新数据,从而避免全表扫描,加快数据库操作速度。在获取表结构时,提前查询表主键信息,根据主键作为条件拼接,完成批量操作

概念

  • 主键

    表中经常有一个列或多列的组合,其值能唯一地标识表中的每一行,这样的一列或多列称为表的主键。通过它可强制表的实体完整性,一个表只能有一个 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';

参考链接


版权声明:本文为weixin_42586723原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。