如何在升级数据表的同时保留原数据

一、问题

项目做到后期,或者项目版本升级时,有时不得不更新原来的数据库设计。比如有一张表,可能需要增加字段、修改字段等。在某些情况下,Alter TABLE命令不能完成这个任务,比如更换主键。这时只能用全新的设计替换掉原来的设计。但是,如果让新设计的表格中,包含原来的数据呢?

二、解决方案

其实很简单,分4步:

  1. 创建新表
  2. 将原表数据插入到新表中
  3. 删除原表
  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;
原文地址:https://www.cnblogs.com/zengbin/p/4307006.html