--SQL批量添加主键脚本

--操作提示:运行此脚本前请记得备份您要操作的数据库
--实现功能:执行脚本后数据库中的所有数据表都会有一个主键
--添加规则1:主键名称为ID(可自己修改),数据类型为整形自增一
--添加规则2:如果数据表已有主键,则不添加
--添加规则3:如果数据表没主键但已存在自增一的标识列,则设置该标识列为主键
--添加规则4:如果数据表没主键且已存在ID列,则会删除掉该列,记得要检查该ID列是否包含重要数据,如果有的话,请执行脚本前改名。 --脚本代码开始
declare @ColumnName nvarchar(250)
set @ColumnName='ID' --要新增的主键列名,可自己修改 declare @TableName nvarchar(250)--游标中取出的数据表名
declare @TableID INT--游标中取出的数据表编号
declare @IdentityColumnName nvarchar(250)--数据表的已有标识列名称 --声明读取数据库所有数据表名和编号的游标
declare mycursor1 cursor for select name,id from dbo.SysObjects WHERE OBJECTPROPERTY(ID, 'IsUserTable') = 1 order by name
--打开游标
open mycursor1
--从游标里取出数据赋值到我们刚才声明的数据表名变量和数据表编号变量中
fetch next from mycursor1 into @TableName,@TableID
--如果游标执行成功
while (@@fetch_status=0)
begin --判断当前数据表是否存在主键,如果数据表已有主键则不添加
IF NOT EXISTS (select * from information_schema.key_column_usage where TABLE_NAME=''+@TableName+'')
begin
--如果数据表中已经存在标识列,则将标识列设置为主键 if Exists(Select top 1 1 from sysobjects Where objectproperty(id, 'TableHasIdentity') = 1 and upper(name) = upper(@TableName))
begin
Select @IdentityColumnName=name from syscolumns Where id = @TableID and columnproperty(id, name, 'IsIdentity') = 1
print '当前数据表['+@TableName+']没有主键但有标识列['+@IdentityColumnName+']'
exec ('ALTER TABLE ['+@TableName+'] ADD CONSTRAINT PK_'+@TableName+' PRIMARY KEY CLUSTERED ('+@IdentityColumnName+') ON [PRIMARY]')
print '成功设置数据表['+@TableName+']已有标识列['+@IdentityColumnName+']为主键'
end
else
begin
print '当前数据表['+@TableName+']没有主键和标识列'
IF EXISTS (select * from syscolumns Where ID=OBJECT_ID(N'['+@TableName+']') and name=''+@ColumnName+'')
begin
--如果已有ID列设置有索引,则删除数据表@TableName中指定字段@ColumnName对应的所有约束
declare @ConstraintName varchar (250)--定义当前查询的约束变量 --声明读取数据表中指定字段对应的所有约束列表游标
declare mycursor2 cursor for select name from sysobjects left join sysconstraints on sysconstraints.constid=sysobjects.id where parent_obj=OBJECT_ID(''+@TableName+'') and colid=(select colid from syscolumns where id=OBJECT_ID(''+@TableName+'') and OBJECTPROPERTY(id, N'IsUserTable') = 1 and upper(name)=upper(@ColumnName))
--打开游标
open mycursor2
--从游标里取出数据赋值到约束名称变量中
fetch next from mycursor2 into @ConstraintName
--如果游标执行成功
while (@@fetch_status=0)
begin
--删除当前找到的约束
exec ('ALTER TABLE ['+@TableName+'] DROP CONSTRAINT ['+@ConstraintName+']')
print '已成功删除数据表['+@TableName+']字段['+@ColumnName+']对应的约束['+@ConstraintName+']'
--用游标去取下一条记录
fetch next from mycursor2 into @ConstraintName
end
--关闭游标
close mycursor2
--撤销游标
deallocate mycursor2 --如果存在列[ID]则先删除该列
exec ('ALTER TABLE ['+@TableName+'] DROP COLUMN '+@ColumnName+'')
--添加数据表的主键列ID
exec ('ALTER TABLE ['+@TableName+'] ADD '+@ColumnName+' [int] IDENTITY(1,1) NOT NULL PRIMARY KEY')
end
else
begin
--如果存在列[ID]则直接添加主键列ID
exec ('ALTER TABLE ['+@TableName+'] ADD '+@ColumnName+' [int] IDENTITY(1,1) NOT NULL PRIMARY KEY')
end print '成功设置数据表['+@TableName+']列['+@ColumnName+']为主键'
end
end
else
begin
print '当前数据表['+@TableName+']已有主键'
end
--用游标去取下一条记录
fetch next from mycursor1 into @TableName,@TableID
end --关闭游标
close mycursor1
--撤销游标
deallocate mycursor1
--脚本代码结束

SQL批量添加主键脚本的更多相关文章

  1. SQL Server 数据库添加主键,唯一键,外键约束脚本

    -- 声明使用数据库use 数据库;go -- 添加主键(primary key)约束-- 基本语法-- 判断主键约束是否存在,如果存在则删除,不存在则添加if exists(select * fro ...

  2. SQL Server 创建表 添加主键 添加列常用SQL语句

    --删除主键 alter table 表名 drop constraint 主键名 --添加主键 alter table 表名 add constraint 主键名 primary key(字段名1, ...

  3. 创建表 添加主键 添加列常用SQL语句

    --删除主键 alter table 表名 drop constraint 主键名--添加主键alter table 表名 add constraint 主键名 primary key(字段名1,字段 ...

  4. SQL Server 创建表 添加主键 添加列常用SQL语句【转】

    --删除主键alter table 表名 drop constraint 主键名--添加主键alter table 表名 add constraint 主键名 primary key(字段名1,字段名 ...

  5. SQL server 添加主外键约束

    ---添加主键约束   alter table 表名 add constraint 约束名 primary key (主键)          - --添加唯一约束   alter table 表名 ...

  6. sqlserver添加主键

    sqlServer中给表添加主键的sql: alter table market_media_medical_history alter column pk_id bigint not null; a ...

  7. Oracle并行添加主键的方法

    环境:Oracle 11.2.0.3 需求:生产一张表由于前期设计不当,没有主键.现需要添加主键,数据量很大,想并行建立.   1.直接添加,提示ora-3001:未实施的功能;只能单线程建立主键 S ...

  8. Oracle使用游标为所有用户表添加主键语句

    应用场合:数据表新增自增一主键能加快数据表的访问速度,而且是整形的索引速度最快.本程序适合在导入Oracle数据库时删除不存在主键的情况下运行. 代码说明:所有的表主键字段名都设置为ID,如果已存在I ...

  9. Oracle不能并行直接添加主键的方法:先建唯一索引后建主键

    环境:Oracle 11.2.0.3 需求:生产一张表由于前期设计不当,没有主键.现需要添加主键,数据量很大,想并行建立. 1.直接添加,提示ora-3001:未实施的功能;只能单线程建立主键 SQL ...

随机推荐

  1. C# empty private constructor

    A private constructor is a special instance constructor. It is generally used in classes that contai ...

  2. uva 1382 - Distant Galaxy

    题目连接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=91208#problem/G 题意:  给出平面上的n个点,找出一个矩形,使得边 ...

  3. android-BaseAdapter自定义控件深刻理解

    一.自定义控件的实现 自定义控件需要继承BaseAdapter抽象类,该类实现了ListAdapter, SpinnerAdapter两个接口,这两个接口继承了Adapter接口类,没错.是继承Ada ...

  4. django基于正则的url匹配

    url.py views.py index.html detail.html 访问:

  5. Ubuntu 12.04 系统安装极点五笔输入法

    习惯用五笔了,在Ubuntu下安装了下五笔: 下面就实际操作,安装极点五笔输入法! 在终端中执行如下命令: sudo wget http://www.xiit.cn/wp-content/upload ...

  6. 支付宝APP支付之Java后台生成签名具体步骤

    /** *支付宝支付 * @param orderId 订单编号 * @param actualPay 实际支付金额 * @return */ private String getOrderInfoB ...

  7. MVC概念性的内容

    MVC:    是一个缩写(model + view + control),      Model:是一些类文件,  功能:负责增删改查, 负责跟数据库打交道 (把数据存入到数据库: 从数据库把数据读 ...

  8. php课程---JavaScript与Jquery的区别

    使用Jquery必须在页面内引入一个Jquery包 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ...

  9. JVM性能监控与故障处理命令行工具

    JDK命令行工具 Sun公司作为”礼物“赠送给JDK使用者的工具: 这些命令行工具大多是jdk/lib/tools.jar类库的一层薄包装,主要功能代码是在tools类库(不属于java的标准API) ...

  10. CentOS7安装mysql5.6.23

    ============安装glibc版本============== 一.下载glibc版本的Mysql mysql-advanced-5.6.23-linux-glibc2.5-x86_64.zi ...