--SQL查找数据库中所有没有主键的数据表脚本
 
--运行脚本后在消息中可能会显示下面现象中的一种:
--(1)数据库中所有数据表都有主键(则证明所有数据表都有主键)
--(2)当前数据表[数据表名]没有主键(则可方便找到没主键的数据表)
 
declare @TableName nvarchar(250)--游标中取出的数据表名
declare @AllTableHasPrimaryKey int--是否全部都有主键
set @AllTableHasPrimaryKey=1
--声明读取数据库所有数据表名和编号的游标
declare mycursor cursor for select name from dbo.SysObjects WHERE OBJECTPROPERTY(ID, 'IsUserTable') = 1 order by name
 --打开游标
open mycursor
--从游标里取出数据赋值到我们刚才声明的数据表名变量中
fetch next from mycursor into @TableName
--如果游标执行成功 
while (@@fetch_status=0)
begin
 
 --判断当前数据表是否存在主键
 IF NOT EXISTS (select * from information_schema.key_column_usage where TABLE_NAME=''+@TableName+'')
 begin
 set @AllTableHasPrimaryKey=0;
 print '当前数据表['+@TableName+']没有主键' 
 end
 
 --用游标去取下一条记录 
    fetch next from mycursor into @TableName
end
 
if(@AllTableHasPrimaryKey=1)
begin
print '数据库中所有数据表都有主键'
end
 
--关闭游标
close mycursor
--撤销游标
deallocate mycursor
--脚本代码结束

----查询表索引

SELECT

OBJECT_NAME(s.object_id) AS 表名,

COUNT(1) AS 唯一索引数量

FROM sys.indexes s

WHERE is_unique = 1

GROUP BY s.object_id

-----查询表table1的主键字段和索引

Declare @table_name varchar(100) 
    Set @table_name='table1'
    --1、可以根据系统存储过程 
    Execute   sp_pkeys @table_name 
    
    --2、根据系统表获得 
    Declare @objectid int 
    Set @objectid=object_id(@table_name) 
    Select    
    col_name(@objectid,colid)  '主键字段' 
    From  sysobjects         as o 
    Inner Join sysindexes    as i On i.name=o.name  
    Inner Join sysindexkeys  as k On k.indid=i.indid 
    Where  
    o.xtype = 'PK' and parent_obj=@objectid and k.id=@objectid

--简易版查询所有主键为空的表

SELECT TableName = O.Name  FROM sys.objects O  WHERE o.name NOT IN ( SELECT o2.name  FROM sysobjects o1  JOIN sysobjects o2 ON o1.parent_obj = o2.id  AND o1.xtype = 'pk' )  AND O.type = 'U'

SQL查找数据库中所有没有主键的数据表脚本的更多相关文章

  1. [SQL]某数据库中查出包含 字段名 的所有表名

    --利用SQL语句来查询字段所在的表 --从某数据库中查出包含 字段名 字段的所有表名 SELECT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE ...

  2. 在数据库中如果组合主键(假设为stuID和stuName)存在则更新,不存在则新增

    这是今天在项目中遇到的问题,后来查了一下,有的网友说可以用存储过程,但自己现在还不会用,所以下记载下来,做为学习存贮过程的引子. 现在是在java中实现了这个if的逻辑,

  3. sql 查找数据库中某字符串所在的表及字段

    declare   @str   varchar(100)     set   @str='是否严格控制'     --要搜索的字符串         declare   @s   varchar(8 ...

  4. 如何把EXCEL数据导入到SQL SERVER数据库中 (转)

    转:http://blog.csdn.net/jjp837661103/article/details/13509889 在我们完成一个项目开发之后,通常我们需要把客户的很多数据导入到数据库中,面对大 ...

  5. 浅析SQL Server数据库中的伪列以及伪列的含义

    SQL Server中的伪列 下午看QQ群有人在讨论(非聚集)索引的存储,说,对于聚集索引表,非聚集索引存储的是索引键值+聚集索引键值:对于非聚集索引表,索引存储的是索引键值+RowId,这应该是一个 ...

  6. 无法将数据库从SINGLE_USER模式切换回MULTI_USER模式(Error 5064),及查找SQL Server数据库中用户spid(非SQL Server系统spid)的方法

    今天公司SQL Server数据库无意间变为SINGLE_USER模式了,而且使用如下语句切换回MULTI_USER失败: ALTER DATABASE [MyDB] SET MULTI_USER W ...

  7. 使用SQL语句查询某表中所有的主键、唯一索引以及这些主键、索引所包含的字段(转)

    SELECT 索引名称 = a.name , 表名 = c.name , 索引字段名 = d.name , 索引字段位置 = d.colid FROM sysindexes a JOIN sysind ...

  8. 转:SQL SERVER数据库中实现快速的数据提取和数据分页

    探讨如何在有着1000万条数据的MS SQL SERVER数据库中实现快速的数据提取和数据分页.以下代码说明了我们实例中数据库的“红头文件”一表的部分数据结构: CREATE TABLE [dbo]. ...

  9. 为什么在MySQL数据库中无法创建外键?(MyISAM和InnoDB详解)

    问题描述:为什么在MySQL数据库中不能创建外键,尝试了很多次,既没有报错,也没有显示创建成功,真实奇了怪,这是为什么呢? 问题解决:通过查找资料,每次在MySQL数据库中创建表时默认的情况是这样的: ...

随机推荐

  1. 'java' 不是内部或外部命令,也不是可运行的程序的两个解决办法

    第一个原因: 是环境变量path没有配置好,做如下图配置     第二个原因:   如果java环境有一段时间没有启动,再启动的时候提示这个,解决办法是进入path环境配置,如上图中界面,将JAVA_ ...

  2. windwon安装macaca环境

      一 安装配置java   1.安装java_jdk ,安装过程中顺带一起安装jre   (1)选择[新建系统变量]--弹出“新建系统变量”对话框,在“变量名”文本框输入“JAVA_HOME”,在“ ...

  3. JavaScript的setTimeout()和setInterval()

    1. setTimeout()方法 作用:在制定的毫秒数后调用函数或计算表达式 语法: setTimeout(code,millisec) 实例: function timedMsg() { var ...

  4. Memcache服务器端+Redis服务器端+PHP Memcache扩展+PHP Memcached扩展+PHP Redis扩展+MemAdmin Memcache管理工具+一些概念(更新中)

    Memcache和Redis因为操作简单,是我们常用的服务器数据缓存系统,以下文字仅作备忘记录,部份转载至网络. 一.定义 1.Memcache Memcache是一个高性能的分布式的内存对象缓存系统 ...

  5. C++模式学习------适配器模式

    适配器模式: 适配器模式属于结构型的设计模式,是将一个类的接口转换成使用方希望的另外一个接口,这样使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 适配器模式有两种: 1.类的适配器:继承不 ...

  6. 基于c的简易计算器一

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include <malloc.h&g ...

  7. springboot整合spring @Cache和Redis

    转载请注明出处:https://www.cnblogs.com/wenjunwei/p/10779450.html spring基于注解的缓存 对于缓存声明,spring的缓存提供了一组java注解: ...

  8. python读取写入内存方法SringIO,BytesIO

    python中不仅仅可以在磁盘中写入文件,还允许直接在内存中直接写入数据:需要借助StringIO和BytesIO来实现: 1.直接操作StringIO from io import StringIO ...

  9. BZOJ 3527 力 | FFT

    BZOJ 3527 力 | 分治 题意 给出数组q,$E_i = \sum_{i < j} \frac{q_i}{(i - j) ^ 2} - \sum_{i > j} \frac{q_i ...

  10. Integer to Roman - LeetCode

    目录 题目链接 注意点 解法 小结 题目链接 Integer to Roman - LeetCode 注意点 考虑输入为0的情况 解法 解法一:从大到小考虑1000,900,500,400,100,9 ...