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

一、问题

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

如何在升级数据表的同时保留原数据的相关文章

MySQL为数据表的指定字段插入数据

username not null 没有默认值/有默认值   insert不插入username字段 均不报错 2014年07月23日21:05    百科369 MySQL为数据表的指定字段插入数据 为数据表的指定字段插入数据,就是在INSERT语句中只向部分字段中插入值,而其它字段的值为数据表定义时的默认值. 基本的语法格式如下: INSERT INTO 表名(字段1,字段2,...,字段m) VALUES(值1,值2,...,值m); 字段1,字段2,...,字段m:表示数据表中的字段名称

关于数据表命名为mysql保留的时候的操作

今天操作数据表的时候,发现order数据表无法进行操作,必须加上反单引号才能进行操作,查了一下原因: 反引号是用来区别mysql关键字的,比如,如果你有一个表名叫select,你就必须写成`select`,因为select是mysql保留字. 反引号是加在数据库名.数据表名和数据表的字段名上面的 例子: 不加反单引号: mysql> show create table order; ERROR 1064 (42000): You have an error in your SQL syntax;

MySql 获取数据表中随机一条数据

通过sql语句获取数据表中的随意一条数据 -- rand() 获取0到1之间的随机浮点数 -- ((select max(id) from test) - (select min(id) from test)) * rand() 获取到随机数 -- + (select min(id) from test) 保证id为 最小ID与最大ID之间的数 select * from test where id >= ((select max(id) from test) - (select min(id)

Oracle 函数 “判断数据表中不存在的数据,才允许通过”

1 create or replace function mca_detail_material_val(p_material_code VARCHAR2, --实参 2 p_material_name VARCHAR2, 3 p_mca_no VARCHAR2 4 ) 5 RETURN varchar2 AS 6 7 --物料编码/名称的验证,数据表(MATERIAL)中 不存在 该物料编码/名称,允许通过,填其他值都不允许通过 8 9 v_count1 NUMBER; -- 形参 10 v_

数据库、数据表的基本操作及查询数据

数据库的基本操作 创建数据库 CREATE DATABASE database_name database_name为要创建的数据库的名称 删除数据库 DROP DATABASE database_name database_name为要删除的数据库的名称 数据库存储引擎 数据库存储引擎是数据库底层软件组成,数据库管理系统(DBMS)使用数据引擎进行创建.查询.更新和删除数据操作. MySQL的核心就是存储引擎. 存储引擎比较 |功能|MyISAM|Memory|InnoDB|Archive|

设置mysql数据表列自动递增以及数据行插入操作

创建mysql数据表,设置id列递增.主键create table running_log ( id int primary key auto_increment, routename varchar(255), log varchar(255), time datetime ); 往有递增数据列的数据表插入新的数据行 1.INSERT INTO `running_log` (`id`, `routename`, `log`, `time`) VALUES ('null', 'yunnan-10

oracle——数据表的相关操作——删除数据表

创建数据表; create table 表名 ( 列明1 数据类型1 [约束性条件], 列明1 数据类型1 [约束性条件], …… ) tablespace 表空间 create table student05 ( student_id number not null, student_name varchar2(20), student_age number, status varchar2(2), version number default 0 ) tablespace test sele

oracle——数据表的相关操作——插入数据以及批量插入数据

SQL更新数据 1.插入数据——insert操作 语法格式如下: insert into 表名 (列名1,列名2……,列名n) values (值1,值2……,值n); 在insert操作中,列名列表中的各列需要以逗号分隔:而值列表指定各列的值,列名与值需要一一对应. 如果insert语句所指定的列名列表包含了表中的所有列,那么可以将列名列表省略. create table student08 ( id number, name varchar2(20), sex varchar2(20), a

在不动用sp_configure的情况下,如何 =》去掉列的自增长,并保留原数据

应用场景:权限不够(只是某个用户,权限很低,不能使用sp_configure) 执行 附录: update BackupShopMenu set TempId=MId alter table BackupShopMenu drop column MId exec sp_rename 'BackupShopMenu.TempId', 'MId', 'column' alter table BackupShopMenu alter column MId int not null --如果你的自动是可