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实现div的鼠标拖拽效果
    JavaScript插件制作-tab选项卡
    javascript插件制作学习-制作步骤
    JavaScript实现页面滚动到div区域div以动画方式出现
    RabbitMQ生产者消费者
    基于TCP/IP协议的socket通讯client
    基于TCP/IP协议的socket通讯server
    MQTT 发布者订阅者
    linux实用命令
    RabbitMQ CentOS6.5 安装
  • 原文地址:https://www.cnblogs.com/zengbin/p/4307006.html
Copyright © 2011-2022 走看看