`
xqf222
  • 浏览: 124988 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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
--脚本代码结束

分享到:
评论

相关推荐

    oracle批量添加主键

    然后,你可以手工或通过脚本批量为这些表添加主键。例如,下面的SQL语句为`APP_CZ_LOG`表添加了一个名为`pl_app_cz_log`的主键约束,其主键字段为`ID`: ```sql ALTER TABLE APP_CZ_LOG ADD CONSTRAINT pl_app_cz_...

    SQLSERVER如何使用脚本生成表

    如果你需要为多个表生成脚本,可以重复上述过程,或者使用SSMS的批量脚本生成功能。在“表”节点上右键,选择“脚本表为” > “创建到” > “文件”或“文件夹”,这样可以将所有脚本保存到指定位置。 除了SSMS,还...

    SQL插入脚本生成器

    SQL插入脚本生成器是一种实用工具,主要用于数据库管理和开发工作中,尤其在数据迁移、测试环境数据准备或批量插入数据时非常有用。C#版本的SQL插入脚本生成器能够根据用户设定的条件,自动化地创建SQL插入语句,极...

    excel生成sql脚本

    在“表结构说明及SQL生成文档.xls”中,可能包含了数据库中的各个表的字段定义,如字段名、数据类型、长度、是否为主键等信息。这些信息是生成SQL脚本的基础,因为它们定义了数据库的架构。你可以通过整理这些信息,...

    sql专栏的脚本文件

    接着,"从零开始sql(2).sql"可能涉及数据的插入,使用INSERT INTO语句将数据添加到表中。同时,也可能会介绍如何批量插入数据,以及如何处理数据类型不匹配等问题。 "从零开始sql(3).sql"很可能是关于查询数据...

    省市区数据sql脚本

    #### 一、省市区数据SQL脚本概述 本文档提供了一套全面且实用的中国省市区基础数据SQL脚本。该脚本为开发者提供了现成的数据表结构及部分省份的数据填充示例,适用于快速构建基于地理位置的应用程序或数据库。 ###...

    sqlserver备份数据库为脚本

    备份sqlserver数据库为txt,可远程 局域网连接, 导出建表脚本,存储过程脚本,数据脚本(视图...可批量导出,可导出数据量很大的数据库,会自动拆分为多个数据脚本,注意选择完整模式 tips:表要有主键,且主键名称最好为id

    从EXCEL批量添加数据到数据库

    总之,从Excel批量添加数据到数据库涉及到数据预处理、数据库连接、SQL操作和可能的ETL工具使用。掌握这些技能,将大大提高你在数据处理和管理中的效率,尤其在需要频繁交互Excel和数据库的工作场景中。在实际操作中...

    MySQL必知必会SQL脚本.zip

    这包括向表中添加单行数据,以及批量插入多行数据。同时,更新数据(UPDATE)和删除数据(DELETE)也是日常数据库操作的一部分。理解这些操作的条件语句,如WHERE子句,是确保数据准确性的关键。 查询是SQL的核心,...

    行政区划表sql脚本

    例如,可以使用INSERT语句逐条添加行政区划信息,或者通过批量导入的方式,如从CSV文件读取数据并进行插入。文件"areacode_t.sql"可能包含了这些INSERT语句,用于填充`areacode`表。 此外,为了方便查询和分析,...

    SQL SERVER 数据自动生成SQL语句

    5. **优化与执行**:为了提高效率,可能还需要对生成的脚本进行优化,例如批量插入,减少事务次数,以提高数据导入速度。 在提供的压缩包文件中,`SQLGernate.exe`很可能就是这样一个工具,它执行上述过程,根据...

    oracle.exportsql.(导出建表脚本)

    建表脚本通常包含了创建数据库表结构的所有SQL语句,包括表名、字段名、字段类型、主键、外键、索引等信息。这对于数据库设计和维护来说极其关键。描述中提到,“只要有一个表清单,就可以导出所有建表脚本”,这...

    中国省市县乡村五级数据库sql2008r2脚本.rar

    3. 数据导入:`geoinfo-sql2008r2.sql`可能是导入脚本,用于将预先整理好的行政区划数据批量导入到新建的数据库中,这涉及到SQL的INSERT语句和批处理技术。 4. SQL查询优化:由于行政区域数据的层级关系复杂,查询...

    SQLServer 批量插入数据的两种方法

    在SQL Server中,批量插入数据是提高数据处理效率的关键技术,尤其当需要处理大量记录时。本文将介绍两种批量插入数据的方法:使用普通的INSERT语句和使用SqlBulkCopy类。 首先,我们创建一个用于测试的数据库`...

    CodeSmith的批量生成数据库表创建脚本的模板

    在本案例中,我们关注的是如何利用CodeSmith来批量生成SQL Server数据库表的创建脚本。 标题"CodeSmith的批量生成数据库表创建脚本的模板"暗示了我们将探讨如何使用CodeSmith的模板功能来自动化生成针对SQL Server...

    SqlServer中批量update语句

    在SQL Server中,批量更新数据是一项常见的操作,特别是在处理大量数据的时候。批量更新语句能够有效地更新一个表中满足特定条件的数据行。标题所提到的"SqlServer中批量update语句"就是一个很好的例子,它展示了...

    SQL省市县脚本支持两种表结构

    在实际操作中,这可能包含了批量插入数据的语句,比如`INSERT INTO city_table (name, parent_id) VALUES ('城市名', '父级ID')`,这样的脚本可以快速地填充数据库,尤其在测试环境或初次部署时非常方便。...

    SQL - 100w条insert脚本 - 顺序乱序.zip

    在SQL数据库管理中,"100w条insert脚本"指的是用于一次性或者批量插入100万个数据记录的SQL语句集合。这样的脚本通常用于数据填充、测试环境搭建或者大数据导入等场景。批量插入可以显著提高数据录入的效率,尤其是...

    ACCP6.0 S2 -SqlSever银行ATM,T-Sql脚本

    2. 数据插入:通过`INSERT INTO`语句将数据添加到表中,可以是单行或批量插入。 3. 查询数据:使用`SELECT`语句从数据库中检索信息,可结合`WHERE`、`GROUP BY`、`HAVING`、`ORDER BY`等子句进行条件筛选、分组、...

Global site tag (gtag.js) - Google Analytics