ITPub博客

首页 > 数据库 > SQL Server > ​SQL SERVER查找表的主键所在的列名

​SQL SERVER查找表的主键所在的列名

原创 SQL Server 作者:lhrbest 时间:2020-11-25 10:39:48 0 删除 编辑

SQL SERVER查找表的主键所在的列名


SELECT   'alter table ' +   object_name ( SYSCOLUMNS . id )   +   ' add primary key(' + SYSCOLUMNS . name + ');' ,   object_name ( SYSCOLUMNS . id )  tb_name , SYSCOLUMNS . name   col_name   , SYSOBJECTS . name  pk_name

   FROM   SYSCOLUMNS , SYSOBJECTS , SYSINDEXES , SYSINDEXKEYS  

   WHERE    SYSOBJECTS . xtype =   'PK'   --sysobjects.xtype对象类型

   AND   SYSOBJECTS . parent_obj =   SYSCOLUMNS . id

   AND   SYSINDEXES . id =   SYSCOLUMNS . id

   AND   SYSOBJECTS . name   =   SYSINDEXES . name  

   AND   SYSINDEXKEYS . id =   SYSCOLUMNS . id

   AND   SYSINDEXKEYS . indid =   SYSINDEXES . indid    --同一表的同一列,可能建有不同类型的索引

   AND   SYSCOLUMNS . colid =   SYSINDEXKEYS . colid

   and    object_name ( SYSCOLUMNS . id )   in   ( 'T_GoodsStocksGlide' , 'DlySale' )

  order   by   SYSOBJECTS . name ;



SELECT  SYSCOLUMNS.name
   FROM  SYSCOLUMNS, SYSOBJECTS, SYSINDEXES, SYSINDEXKEYS 
   WHERE  SYSCOLUMNS.id =  object_id( 'Tab_XXX'--syscolumns.id为该列所属的表对象ID 
  AND  SYSOBJECTS.xtype =  'PK'  --sysobjects.xtype对象类型
  AND  SYSOBJECTS.parent_obj =  SYSCOLUMNS.id 
  AND  SYSINDEXES.id =  SYSCOLUMNS.id 
  AND  SYSOBJECTS.name =  SYSINDEXES.name 
  AND  SYSINDEXKEYS.id =  SYSCOLUMNS.id 
  AND  SYSINDEXKEYS.indid =  SYSINDEXES.indid    --同一表的同一列,可能建有不同类型的索引 
  AND  SYSCOLUMNS.colid =  SYSINDEXKEYS.colid

  注意:这是在4张系统表中寻找的,关系比较复杂,大致可以表示为:
   SYSCOLUMNS中存有表中的列colid和表id,sysobjects表中存有主键名字(即PK_Table类似)和表id,sysindexes中存 有主键名字和表id和index编号,sysindexkeys中存有表id和index编号和列编号,一项一项对应起来后就能找到列名了。

SELECT * FROM SYSCOLUMNS 
--SYSCOLUMNS每个表和视图中的每列在表中占一行,存储过程中的每个参数在表中也占一行。
--syscolumns.id为该列所属的表对象ID
--syscolumns.colid为该列对象ID

SELECT * FROM SYSOBJECTS
--SYSOBJECTS在数据库内创建的每个对象(约束、默认值、日志、规则、存储过程、表、视图、等)在表中占一行。
--sysobjects.xtype对象类型
--sysobjects.parent_obj父对象的对象标识号(例如,对于触发器或约束,该标识号为表id)
--sysobjects.name对象名称,这里为主键名字(即PK_Table类似)


SELECT * FROM SYSINDEXES
--数据库中的每个索引和表在表中各占一行。
--sysindexes.id 表ID(如果 indid = 0 或 255)。否则为索引所属表id。
--sysindexes.name 表名(如果 indid = 0 或 255)。否则为索引的名称。这里为有主键名字(主键必为索引,见下述分析)
--sysindexes.indid 索引ID的类型

SELECT * FROM SYSINDEXKEYS
--数据库中的每个索引和表在表中各占一行。
--sysindexkeys.id      表ID
--sysindexkeys.indid  索引ID的类型
--sysindexkeys.colid   列ID

    主键一定是唯一性索引,唯一性索引并不一定就是主键

    所谓主键就是能够唯一标识表中某一行的属性或属性组,一个表只能有一个主键,但可以有多个候选索引。因为主键可以唯一标识某一行记录,所以可以确保执行数据更新、删除的时候不会出现张冠李戴的错误。主键除了上述作用外,常常与外键构成参照完整性约束,防止出现数据不一致。数据库在设计时,主键起到了很重要的作用。

    主键可以保证记录的唯一和主键域非空, 数据库管理系统对于主键自动生成唯一索引,所以主键也是一个特殊的索引。




About Me

........................................................................................................................

● 本文作者:小麦苗,部分内容整理自网络,若有侵权请联系小麦苗删除

● 本文在个人微 信公众号( DB宝)上有同步更新

● QQ群号: 230161599 、618766405,微信群私聊

● 个人QQ号(646634621),微 信号(db_bao),注明添加缘由

● 于 2020年11月完成

● 最新修改时间:2020年11月

● 版权所有,欢迎分享本文,转载请保留出处

........................................................................................................................

小麦苗的微店https://weidian.com/s/793741433?wfr=c&ifr=shopdetail

● 小麦苗出版的数据库类丛书: http://blog.itpub.net/26736162/viewspace-2142121/

小麦苗OCP、OCM、高可用、MySQL、DBA学习班http://blog.itpub.net/26736162/viewspace-2148098/

● 数据库笔试面试题库及解答: http://blog.itpub.net/26736162/viewspace-2134706/

........................................................................................................................

请扫描下面的二维码来关注小麦苗的微 信公众号( DB宝)及QQ群(230161599、618766405)、添加小麦苗微 信(db_bao), 学习最实用的数据库技术。

........................................................................................................................

 

 



来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26736162/viewspace-2736685/,如需转载,请注明出处,否则将追究法律责任。

下一篇: sql server解析日志
请登录后发表评论 登录
全部评论
【QQ:646634621】【微信:db_bao】【微信公众号:DB宝】【11g、12c OCM】【QQ群:230161599、618766405】【《数据库笔试面试宝典》作者】【OCP、OCM、高可用(RAC+DG+OGG)、MySQL培训班已开讲,只讲实用内容】

注册时间:2012-09-23

  • 博文量
    1586
  • 访问量
    9170526