一、问题
项目做到后期,或者项目版本升级时,有时不得不更新原来的数据库设计。比如有一张表,可能需要增加字段、修改字段等。在某些情况下,Alter TABLE命令不能完成这个任务,比如更换主键。这时只能用全新的设计替换掉原来的设计。但是,如果让新设计的表格中,包含原来的数据呢?
二、解决方案
其实很简单,分4步:
- 创建新表
- 将原表数据插入到新表中
- 删除原表
- 将新表重命名为原表名
三、实例
知名开源项目BlogEngine.NET就是这样做的!比如以下是它从2.0版本升级到2.5版本时,所使用的SQLite数据库升级脚本的一部分,对be_Posts表做了升级。
1 -- 2 -- Update be_Posts 3 -- 4 Create TABLE be_PostsNew ( 5 [PostRowID] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 6 [BlogID] VARCHAR(36) NOT NULL, 7 [PostID] VARCHAR(36) NOT NULL, 8 [Title] VARCHAR(255) NOT NULL, 9 [Description] TEXT NOT NULL, 10 [PostContent] TEXT NOT NULL, 11 [DateCreated] DATETIME NOT NULL, 12 [DateModified] DATETIME NOT NULL, 13 [Author] VARCHAR(50) NOT NULL, 14 [IsPublished] BOOLEAN NOT NULL, 15 [IsCommentEnabled] BOOLEAN NOT NULL, 16 [Raters] INTEGER NOT NULL, 17 [Rating] REAL NOT NULL, 18 [Slug] VARCHAR(255) NOT NULL, 19 [IsDeleted] BOOLEAN NOT NULL 20 ); 21 22 Insert INTO be_PostsNew 23 (BlogID, PostID, Title, Description, PostContent, DateCreated, 24 DateModified, Author, IsPublished, IsCommentEnabled, Raters, 25 Rating, Slug, IsDeleted) 26 Select ‘27604f05-86ad-47ef-9e05-950bb762570c‘, p.PostID, p.Title, p.Description, p.PostContent, p.DateCreated, 27 p.DateModified, p.Author, p.IsPublished, p.IsCommentEnabled, p.Raters, 28 p.Rating, p.Slug, p.IsDeleted 29 FROM be_Posts p; 30 31 Drop TABLE be_Posts; 32 Alter TABLE be_PostsNew RENAME TO be_Posts;
时间: 2024-10-14 01:05:37