根据sql脚本修改数据库表结构的几种解决方案
最近由于项目需要要做一个小工具。
需求:客户用的老库并存储了一些数据,用了一段时间,我们根据客户提出新功能在老库的基础上对新库进行修改。这些修改有很多细节方面的修改,包含存储过程,增加表,修改表字段类型,添加字段。
然后我们自己更新并测试好软件后,需要改动客户那边的老库,老库的数据是要保存的。
解决方案一:很快我就想到用SQL SERVER 08 R2 自带的功能,生成新库脚本。把老库改个名字,跑新库脚本,然后通过数据库自带功能把老库数据导入到新库数据。测试的时候,数据量不大,速度还比较理想。
但是这对客户来说还是很不方便的,且数据量大些还是比较费时的。于是,boss就让我做个小工具吧。
难道我要用程序实现以上操作,oh my god !
于是我想啊想。。。。
解决方案二:我就再细一些,直接操作数据库的表吧,对于数据库中存在的表,我给它重新命名,跑个新脚本建表,然后把老表中数据插进去。
相关SQL语句如下:
修改表名:EXEC sp_rename oldName , newName
插入数据:insert into newTable(column1,column2, ..) select column1,column2, .. from oldTable
更多相关操作:
参考数据库、表、列的重命名
列出参考内容来方便查看
一、更改数据库名
sp_rename [ @objname = ] object_name ,
[ @newname = ] new_name
[ , [ @objtype = ] object_type ]
/////////////////////////////////////////////
A. 重命名表
下例将表 customers 重命名为 custs。
EXEC sp_rename customers , custs
B. 重命名列
下例将表 customers 中的列 contact title 重命名为 title。
EXEC sp_rename customers.[contact title] , title , COLUMN
参考 复制表结构和表数据的SQL语句
列出参考内容来方便查看
1.复制表结构及数据到新表
CREATE TABLE 新表 SELECT * FROM 旧表
2.只复制表结构到新表
CREATE TABLE 新表 SELECT * FROM 旧表 WHERE 1=2
即:让WHERE条件不成立.
方法二:(由tianshibao提供)
CREATE TABLE 新表 LIKE 旧表
3.复制旧表的数据到新表(假设两个表结构一样)
INSERT INTO 新表 SELECT * FROM 旧表
4.复制旧表的数据到新表(假设两个表结构不一样)
INSERT INTO 新表(字段1,字段2, .) SELECT 字段1,字段2, FROM 旧表
想到这,发现好像还少了点什么,呃,procedure和constraint,好吧,那我也先删除再添加
先查出来
select name from sys.procedures
select constraint_name, table_name from information_schema.table_constraints
再删除
drop procedure [dbo].[procedure_name]
alter table tableName drop CONSTRAINT [PK_ |FK_ |UK_ |DF_ |CK_]
这里再补充一些东西,关于约束前缀,参考SQL约束前缀
方便查看,再列出来
主键
constraint PK_字段 primary key(字段),
唯一约束
constraint UK_字段 unique key(字段),
默认约束
constrint DF_字段 default( 默认值 ) for 字段,
检查约束
constraint CK_字段 check(约束。如:len(字段) 1),
主外键关系
constraint FK_主表_从表 foreign(外键字段) references 主表(主表主键字段)
然后再从脚本中读取相应脚本文件并执行(加句废话:要执行多行脚本文件,CommandText里加 \n 就好了)。
解决方案三:思来想去,为什么非要导入数据,直接改表结构就好了呀。于是读取表中字段
select column_name,data_type from information_schema.columns where table_name = tableName
对于旧表中存在的字段
ALTER TABLE [tableName] ALTER COLUMN [columnName] [int] NOT NULL
对于旧表中不存在的字段
ALTER TABLE [tableName] ADD COLUMN [columnName] [int] NOT NULL
这样一来就不用导入数据就可以把旧库结构更新,其中除了运用一些ADO.NET方面的知识,还用到了正则表达式之类的来匹配脚本中相应的SQL命令。当然目前的方案还存在一些问题,这个工具还不够通用,对需要旧表多余的列并没有删除,还有容错性方面考虑得也不够周到。后期还会根据项目需要进一步改进的。
我想要获取技术服务或软件
服务范围:MySQL、ORACLE、SQLSERVER、MongoDB、PostgreSQL 、程序问题
服务方式:远程服务、电话支持、现场服务,沟通指定方式服务
技术标签:数据恢复、安装配置、数据迁移、集群容灾、异常处理、其它问题
本站部分文章参考或来源于网络,如有侵权请联系站长。
数据库远程运维 根据sql脚本修改数据库表结构的几种解决方案
相关文章
- 使用SQL语句创建表_用sql语句创建员工表
- sql中的count(1)、count(主键)、count(*)效率问题详解数据库
- Oracle数据库中添加字段的SQL操作(oracle添加字段sql)
- C语言连接SQL Server数据库(c访问sqlserver)
- 数据库使用SQL链接Oracle数据库的技术窍门(sql链接oracle)
- 连接Oracle数据库,使用SQL进行查询(sql连oracle)
- 轻松实现MySQL SQL批量执行方法,快速操作数据库(mysql批量执行sql)
- SQL Server用编程管理数据库的好处(编程sqlserver)
- 瑞星SQL Server:简便极速的数据库应用解决方案(瑞星sqlserver)
- MySQL数据库的SQL语句执行过程(mysql执行sql)
- SQL Server——优质的数据库服务器解决方案(关于SQLServer)
- SQL Server数据库被成功还原(sqlserver被还原)
- SQL Server 社区版:免费的入门数据库管理解决方案(sqlserver社区版)
- SQL Server——一种强大的数据库管理系统(什么是sqlserver)
- SQL Server出栈,推动数据库行业新变革(sqlserver出栈)
- SQL Server:不断进化的数据库版本(sqlserver个版本)
- Oracle数据库如何写复杂SQL语句?(oracle复杂sql)
- Oracle SQL跟踪工具的使用指南(oracle跟踪sql工具)
- Oracle SQL添加列:轻松实现更新数据库表的目的(oracle添加列sql)
- 提升效率:用MySQL查看SQL代码的性能(mysql查看sql执行效率)
- 阿里云搭建SQL Server数据库实现在线访问(阿里sqlserver)
- Oracle SQL遍历向数据库中求索无止境(oracle sql遍历)
- Oracle10 SQL进入新一代数据库时代(oracle10 sql)