原文:MS SQL SERVER搜索某个表的主键所在的列名

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

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

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

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

MS SQL SERVER搜索某个表的主键所在的列名的更多相关文章

  1. Oracle\MS SQL Server Update多表关联更新

    原文:Oracle\MS SQL Server Update多表关联更新 一条Update更新语句是不能更新多张表的,除非使用触发器隐含更新.而表的更新操作中,在很多情况下需要在表达式中引用要更新的表 ...

  2. 【转】SQL Server 创建约束图解 唯一 主键-界面操作

    SQL Server 创建约束图解 唯一 主键-界面操作 SQLServer中有五种约束,Primary Key约束.Foreign Key约束.Unique约束.Default约束和Check约束, ...

  3. MS Sql Server 数据库或表修复(DBCC CHECKDB)

    MS Sql Server 提供了很多数据库修复的命令,当数据库质疑或是有的无法完成读取时可以尝试这些修复命令.  1. DBCC CHECKDB  重启服务器后,在没有进行任何操作的情况下,在SQL ...

  4. MS SQL Server中数据表、视图、函数/方法、存储过程是否存在判断及创建

    前言 在操作数据库的时候经常会用到判断数据表.视图.函数/方法.存储过程是否存在,若存在,则需要删除后再重新创建.以下是MS SQL Server中的示例代码. 数据表(Table) 创建数据表的时候 ...

  5. SQL Server 2005 和自增长主键identity说再见——NEWSEQUENTIALID()(转载)

    在SQL Server 2005环境下,表的主键应该怎样设计.目前主要用到的主键方案共三种: 自动增长主键 手动增长主键 UNIQUEIDENTIFIER主键 1.先说自动增长主键,它的优点是简单,类 ...

  6. SQL server 子查询、设置主键外键、变量及变量查询

    一.子查询 子查询,又叫做嵌套查询. 将一个查询语句做为一个结果集供其他SQL语句使用,就像使用普通的表一样,被当作结果集的查询语句被称为子查询. 子查询有两种类型: 一种是只返回一个单值的子查询,这 ...

  7. SQL Server 创建约束图解 唯一 主键

    SQLServer中有五种约束,Primary Key约束.Foreign Key约束.Unique约束.Default约束和Check约束,今天使用SQL Server2008来演示下这几种约束的创 ...

  8. SQL SERVER中获取表间主外键关系

    sql server 2008中的主外键关系获取方式: 转自:http://www.cnblogs.com/ke10/archive/2012/06/11/2544655.html SELECT OB ...

  9. MS Sql Server 数据库或表修复(Log日志文件损坏的修复方法)

    ----------------- [1] use master go sp_configure reconfigure with override go ----------------- [2] ...

随机推荐

  1. Android 三种方式实现自定义圆形进度条ProgressBar

    一.通过动画实现 定义res/anim/loading.xml如下: <?xml version="1.0" encoding="UTF-8"?> ...

  2. linux 安装scrt

    http://www.vandyke.com/products/securecrt/  wget http://download.boll.me/securecrt_linux_crack.pl pe ...

  3. [React] Keep Application State in Sync with Browser History

    Using pushState and passing route data via context allows our application to respond to route change ...

  4. 01_Git的安装和简单使用(命令行模式+图形化模式)

      刚开始用git的小白适用,参考链接:http://www.cnblogs.com/qijunjun/p/7137207.html  实际项目开发中,我们经常会用一些版本控制器来托管自己的代码,今天 ...

  5. STL源代码学习--vector用法汇总

    一.容器vector 使用vector你必须包含头文件<vector>: #include<vector> 型别vector是一个定义于namespace std内的templ ...

  6. C#连接Sqlserver代码

    刚开始把数据库的密码搞错了,硬是连不上... //数据库连接类 SqlConnection conn = new SqlConnection("server=.;database=test; ...

  7. 使用python抓取CSDN关注人的全部公布的文章

    # -*- coding: utf-8 -*- """ @author: jiangfuqiang """ import re import ...

  8. htmlunit 模拟登录 无验证码

    1.模拟登录csdn,最开始的时候使用的是httpclient,网上的所有模拟登录csdn的版本都是找到lt/execution/event_id.连同用户名及密码 一起发送即可,但是目前的csdn的 ...

  9. 【u253】售货厅

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 售票厅出售关于音乐会的票,取代原来的卖一张票的形式,而是一组座号连续的票.售票室已经收到很多预订.每个 ...

  10. 读取Jar包外面的配置文件

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/shenxiandashu/article/details/79193705 比较常用的方法是将pro ...