如何在升级数据表的同时保留原数据
2016-01-16 14:58
246 查看
一、问题
项目做到后期,或者项目版本升级时,有时不得不更新原来的数据库设计。比如有一张表,可能需要增加字段、修改字段等。在某些情况下,ALTER TABLE命令不能完成这个任务,比如更换主键。这时只能用全新的设计替换掉原来的设计。但是,如果让新设计的表格中,包含原来的数据呢?
二、解决方案
其实很简单,分4步:
创建新表
将原表数据插入到新表中
删除原表
将新表重命名为原表名
三、实例
知名开源项目BlogEngine.NET就是这样做的!比如以下是它从2.0版本升级到2.5版本时,所使用的SQLite数据库升级脚本的一部分,对be_Posts表做了升级。
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
--
-- Update be_Posts
--
CREATE TABLE be_PostsNew (
[PostRowID] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
[BlogID] VARCHAR(36) NOT NULL,
[PostID] VARCHAR(36) NOT NULL,
[Title] VARCHAR(255) NOT NULL,
[Description] TEXT NOT NULL,
[PostContent] TEXT NOT NULL,
[DateCreated] DATETIME NOT NULL,
[DateModified] DATETIME NOT NULL,
[Author] VARCHAR(50) NOT NULL,
[IsPublished] BOOLEAN NOT NULL,
[IsCommentEnabled] BOOLEAN NOT NULL,
[Raters] INTEGER NOT NULL,
[Rating] REAL NOT NULL,
[Slug] VARCHAR(255) NOT NULL,
[IsDeleted] BOOLEAN NOT NULL
);
INSERT INTO be_PostsNew
(BlogID, PostID, Title, Description, PostContent, DateCreated,
DateModified, Author, IsPublished, IsCommentEnabled, Raters,
Rating, Slug, IsDeleted)
SELECT '27604f05-86ad-47ef-9e05-950bb762570c', p.PostID, p.Title, p.Description, p.PostContent, p.DateCreated,
p.DateModified, p.Author, p.IsPublished, p.IsCommentEnabled, p.Raters,
p.Rating, p.Slug, p.IsDeleted
FROM be_Posts p;
DROP TABLE be_Posts;
ALTER TABLE be_PostsNew RENAME TO be_Posts;
项目做到后期,或者项目版本升级时,有时不得不更新原来的数据库设计。比如有一张表,可能需要增加字段、修改字段等。在某些情况下,ALTER TABLE命令不能完成这个任务,比如更换主键。这时只能用全新的设计替换掉原来的设计。但是,如果让新设计的表格中,包含原来的数据呢?
二、解决方案
其实很简单,分4步:
创建新表
将原表数据插入到新表中
删除原表
将新表重命名为原表名
三、实例
知名开源项目BlogEngine.NET就是这样做的!比如以下是它从2.0版本升级到2.5版本时,所使用的SQLite数据库升级脚本的一部分,对be_Posts表做了升级。
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
--
-- Update be_Posts
--
CREATE TABLE be_PostsNew (
[PostRowID] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
[BlogID] VARCHAR(36) NOT NULL,
[PostID] VARCHAR(36) NOT NULL,
[Title] VARCHAR(255) NOT NULL,
[Description] TEXT NOT NULL,
[PostContent] TEXT NOT NULL,
[DateCreated] DATETIME NOT NULL,
[DateModified] DATETIME NOT NULL,
[Author] VARCHAR(50) NOT NULL,
[IsPublished] BOOLEAN NOT NULL,
[IsCommentEnabled] BOOLEAN NOT NULL,
[Raters] INTEGER NOT NULL,
[Rating] REAL NOT NULL,
[Slug] VARCHAR(255) NOT NULL,
[IsDeleted] BOOLEAN NOT NULL
);
INSERT INTO be_PostsNew
(BlogID, PostID, Title, Description, PostContent, DateCreated,
DateModified, Author, IsPublished, IsCommentEnabled, Raters,
Rating, Slug, IsDeleted)
SELECT '27604f05-86ad-47ef-9e05-950bb762570c', p.PostID, p.Title, p.Description, p.PostContent, p.DateCreated,
p.DateModified, p.Author, p.IsPublished, p.IsCommentEnabled, p.Raters,
p.Rating, p.Slug, p.IsDeleted
FROM be_Posts p;
DROP TABLE be_Posts;
ALTER TABLE be_PostsNew RENAME TO be_Posts;
相关文章推荐
- sqlite的数据导入 导出
- 设置Windows 8.1屏幕自己主动旋转代码, Auto-rotate function code
- git修改提交的用户名
- sqlite数据库中的sql语句大全
- android stdio 导入类库出错
- js/jquery使用记录
- 学习Wireshark(六):狙击网络高延时点
- 如何查看系统启动时间-
- 开始学习bootstrap啦!
- 传智播客 RMI及JMS全程
- javascript中同步加载和异步加载详解2
- IoC容器Autofac之实例引入(一)
- centos安装pomelo
- 拖动文件到winform窗体事件并获取拖动的文件路径
- NO.14 两个div并排,左边为绝对宽度,右边为相对宽度
- 如何printf64位整型! scanf sscanf
- tarball安装
- javascript中同步加载和异步加载详解1
- Node.js_Dns模块
- 如何查看系统启动时间-转