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搜索某个表的主键所在的列名的更多相关文章
- Oracle\MS SQL Server Update多表关联更新
原文:Oracle\MS SQL Server Update多表关联更新 一条Update更新语句是不能更新多张表的,除非使用触发器隐含更新.而表的更新操作中,在很多情况下需要在表达式中引用要更新的表 ...
- 【转】SQL Server 创建约束图解 唯一 主键-界面操作
SQL Server 创建约束图解 唯一 主键-界面操作 SQLServer中有五种约束,Primary Key约束.Foreign Key约束.Unique约束.Default约束和Check约束, ...
- MS Sql Server 数据库或表修复(DBCC CHECKDB)
MS Sql Server 提供了很多数据库修复的命令,当数据库质疑或是有的无法完成读取时可以尝试这些修复命令. 1. DBCC CHECKDB 重启服务器后,在没有进行任何操作的情况下,在SQL ...
- MS SQL Server中数据表、视图、函数/方法、存储过程是否存在判断及创建
前言 在操作数据库的时候经常会用到判断数据表.视图.函数/方法.存储过程是否存在,若存在,则需要删除后再重新创建.以下是MS SQL Server中的示例代码. 数据表(Table) 创建数据表的时候 ...
- SQL Server 2005 和自增长主键identity说再见——NEWSEQUENTIALID()(转载)
在SQL Server 2005环境下,表的主键应该怎样设计.目前主要用到的主键方案共三种: 自动增长主键 手动增长主键 UNIQUEIDENTIFIER主键 1.先说自动增长主键,它的优点是简单,类 ...
- SQL server 子查询、设置主键外键、变量及变量查询
一.子查询 子查询,又叫做嵌套查询. 将一个查询语句做为一个结果集供其他SQL语句使用,就像使用普通的表一样,被当作结果集的查询语句被称为子查询. 子查询有两种类型: 一种是只返回一个单值的子查询,这 ...
- SQL Server 创建约束图解 唯一 主键
SQLServer中有五种约束,Primary Key约束.Foreign Key约束.Unique约束.Default约束和Check约束,今天使用SQL Server2008来演示下这几种约束的创 ...
- SQL SERVER中获取表间主外键关系
sql server 2008中的主外键关系获取方式: 转自:http://www.cnblogs.com/ke10/archive/2012/06/11/2544655.html SELECT OB ...
- MS Sql Server 数据库或表修复(Log日志文件损坏的修复方法)
----------------- [1] use master go sp_configure reconfigure with override go ----------------- [2] ...
随机推荐
- 基于 Android NDK 的学习之旅-----HelloWorld
Hello World作为所有编程语言的起始阶段,占据着无法改变的地位,所有中/英/法/德/美……版本的编程教材中,hello world总是作为第一个TEST记录于书本之中,所有的编程第一步就在于此 ...
- [Javascript] Identify and Deal with NaN in JavaScript
Dealing with the special NaN value can be tricky in JavaScript. It behaves like a number and not a n ...
- java 替换json字符串中间的引号保留两边的引号,避免json校验失败
一.json概要 JSON(JavaScript Object Notation, JS 对象标记)-一种轻量级的数据交换标准(相对xml),独立于编程语言.具体以逗号分隔的key:value键值对的 ...
- TimeUnit用法
TimeUnit是java.util.concurrent包下面的一个类,表示给定单元粒度的时间段 1.主要作用 时间颗粒度转换 延时 2.常用的颗粒度 TimeUnit.DAYS //天 TimeU ...
- linux下Java程序中插入DB中国的数据乱码问题
首先,插入到DB数据,在Linux在查询时,现场展示??. 再次,在windows连接到db上,查看的结果并非乱码. 改动Eclipse软件中的编码:如上图:windows菜单->prefere ...
- 使用Akka、Kafka和ElasticSearch等构建分析引擎 -- good
本文翻译自Building Analytics Engine Using Akka, Kafka & ElasticSearch,已获得原作者Satendra Kumar和网站授权. 在这篇文 ...
- Linux常用 bash
学会Linux常用 bash命令 目录 基本操作1.1. 文件操作1.2. 文本操作1.3. 目录操作1.4. SSH, 系统信息 & 网络操作 基本 Shell 编程2.1. 变量2.2. ...
- Smarty优缺点
Smarty优点: 1. 速度:采用smarty编写的程序可以获得最大速度的提高,这一点是相对于其它的模板引擎技术而言的. 2. 编译型:采用smarty编写的程序在运行时要编译成一个非模板技术的PH ...
- WPF依赖属性(续)(3)依赖属性存储
原文:WPF依赖属性(续)(3)依赖属性存储 在之前的两篇,很多朋友参与了讨论,也说明各位对WPF/SL计数的热情,对DP系统各抒已见,当然也出现了一些分歧. 以下简称DP为依赖属性 ...
- VS编译环境中TBB配置和C++中lambda表达式
TBB(Thread Building Blocks),线程构建模块,是由Intel公司开发的并行编程开发工具,提供了对Windows,Linux和OSX平台的支持. TBB for Windows ...