SQL批量添加主键脚本
--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批量添加主键脚本的更多相关文章
- SQL Server 数据库添加主键,唯一键,外键约束脚本
-- 声明使用数据库use 数据库;go -- 添加主键(primary key)约束-- 基本语法-- 判断主键约束是否存在,如果存在则删除,不存在则添加if exists(select * fro ...
- SQL Server 创建表 添加主键 添加列常用SQL语句
--删除主键 alter table 表名 drop constraint 主键名 --添加主键 alter table 表名 add constraint 主键名 primary key(字段名1, ...
- 创建表 添加主键 添加列常用SQL语句
--删除主键 alter table 表名 drop constraint 主键名--添加主键alter table 表名 add constraint 主键名 primary key(字段名1,字段 ...
- SQL Server 创建表 添加主键 添加列常用SQL语句【转】
--删除主键alter table 表名 drop constraint 主键名--添加主键alter table 表名 add constraint 主键名 primary key(字段名1,字段名 ...
- SQL server 添加主外键约束
---添加主键约束 alter table 表名 add constraint 约束名 primary key (主键) - --添加唯一约束 alter table 表名 ...
- sqlserver添加主键
sqlServer中给表添加主键的sql: alter table market_media_medical_history alter column pk_id bigint not null; a ...
- Oracle并行添加主键的方法
环境:Oracle 11.2.0.3 需求:生产一张表由于前期设计不当,没有主键.现需要添加主键,数据量很大,想并行建立. 1.直接添加,提示ora-3001:未实施的功能;只能单线程建立主键 S ...
- Oracle使用游标为所有用户表添加主键语句
应用场合:数据表新增自增一主键能加快数据表的访问速度,而且是整形的索引速度最快.本程序适合在导入Oracle数据库时删除不存在主键的情况下运行. 代码说明:所有的表主键字段名都设置为ID,如果已存在I ...
- Oracle不能并行直接添加主键的方法:先建唯一索引后建主键
环境:Oracle 11.2.0.3 需求:生产一张表由于前期设计不当,没有主键.现需要添加主键,数据量很大,想并行建立. 1.直接添加,提示ora-3001:未实施的功能;只能单线程建立主键 SQL ...
随机推荐
- 设备像素比devicePixelRatio简单介绍
本文所说devicePixelRatio其实指的是window.devicePixelRatio, 被所有WebKit浏览器以及Opera所支持,随着显示器的发展,这个属性也慢慢登上了前端技术的舞台. ...
- Odoo attrs X2many 类型的过滤
有童鞋在群里问到 attrs 中的 many2many类型的字段该如何进行domain过滤,其实非常简单: Many2many的字段在js中获取的值的格式为[[6,false,[]]] 所以attrs ...
- uva705--slash maze
/*这道题我原本是将斜线迷宫扩大为原来的两倍,但是在这种情况下对于在斜的方向上的搜索会变的较容易出错,所以参考了别人的思路后将迷宫扩展为原来的3倍,这样就变成一般的迷宫问题了*/ #include&q ...
- zju(4)使用busybox制作根文件系统
1.实验目的 1.学习和掌握busybox相关知识及应用: 2.学会使用交叉编译器定制一个busybox: 3.利用该busybox制作一个文件系统: 4.熟悉根文件系统组织结构: 5.定制.编译ra ...
- mysql维护常用命令
mysql一个字段的值是将其他字段的被容链接一块 UPDATE `tablename` SET 字段1=CONCAT(字段2," ",字段3," ",字段4) ...
- HDU 3695 Computer Virus on Planet Pandora(AC自动机模版题)
Computer Virus on Planet Pandora Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 256000/1280 ...
- JavaScript 入门教程一 开篇介绍
一.JavaScript 刚开始是为了解决一些由服务器端进行的验证而开发的前端语言.在宽带还不普及的90年代,当用户辛苦输入很多信息并提交给服务器后,等了漫长的时间,等到的不是提交成功的提示而是某些必 ...
- 用Scala实现集合中相邻元素间的差值
欢迎转载,转载请注明出处,徽沪一郎. 概要 代码这东西,不写肯定不行,新学Scala不久,将实际遇到的一些问题记录下来,日后也好查找. 今天讲的是如何计算同一集合中元素两两之间的差值,即求开始集合(a ...
- mysql中的字符串类型数据索引优化
摘自 "高性能mysql" 对于一些字符串类型较长的字段搜索时, 可以参考如下方法
- 【转】Unity中的协同程序-使用Promise进行封装(一)
原文:http://gad.qq.com/program/translateview/7170767 译者:陈敬凤(nunu) 审校:王磊(未来的未来) 每个Unity的开发者应该都对协同程序非 ...