一、问题
项目做到后期,或者项目版本升级时,有时不得不更新原来的数据库设计。比如有一张表,可能需要增加字段、修改字段等。在某些情况下,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;