zoukankan      html  css  js  c++  java
  • 如何在升级数据表的同时保留原数据

    一、问题

    项目做到后期,或者项目版本升级时,有时不得不更新原来的数据库设计。比如有一张表,可能需要增加字段、修改字段等。在某些情况下,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;
  • 相关阅读:
    javascript如何实现图片隐藏?
    TypeScript数字分隔符和更严格的类属性检查
    JS 原生闭包模块化开发总结
    详解浏览器储存
    对象扩展运算符和 rest 运算符及 keyof 和查找类型
    Js实现动态轮播图效果
    javascript选择器有哪些?
    javascript的事件流模型都有什么?
    理解JavaScript中的语法和代码结构
    14. Cantor表
  • 原文地址:https://www.cnblogs.com/zengbin/p/4307006.html
Copyright © 2011-2022 走看看