【问题标题】:Update database schema while preserving data (and relationships)在保留数据(和关系)的同时更新数据库模式
【发布时间】:2015-03-30 15:31:56
【问题描述】:

我有一个简单的数据库模式,其中包含 5 个表和一些外键关系。现在我想在不丢失关系的情况下更新架构。

SQLite 不支持我要执行的操作。我想标记一列AUTOINCREMENT。所以我搜索并发现我需要重新创建表。

在所有关系中,外键是自动生成的行 ID。当我重新插入数据时,这会改变(对吗?)。最好的情况是关系不匹配。最坏的情况(我认为)将是外键不对应任何内容。我该如何避免这种情况?

我能想到的一种方法是将所有数据转储到专为此练习而设计的特殊模型中。这个特殊的模型将封装所有的关系。然后我可以开始按照从小到大的依赖关系升序创建新表。没有外键的表(但其他表使用它的 ID)首先进入。在插入行时,我更新了模型实例。

有没有更好的方法来做到这一点?感谢您的阅读。

【问题讨论】:

    标签: android sqlite upgrade


    【解决方案1】:

    自动递增列中的值可以设置为显式值:

    INSERT INTO MyTable(MyAutoincID, Name) VALUES(42, 'hello')
    

    只需将 ID 与其他列值一起复制即可。

    此外,只要不启用PRAGMA foreign_keyssetForeignKeyConstraintsEnabled()的外键检查,你的数据库暂时允许有不一致的数据。

    【讨论】:

    • 有趣的是,一旦您实现了产品,文档就开始变得有意义。我回到autoincrement 文档,似乎如果旧数据库处于一致状态,INSERT INTO MyTable(MyAutoincID, Name) VALUES(42, 'hello') 就可以了。但由于我的表 ID 目前没有自动递增,因此行 ID 不是按递增顺序排列的。由于新表具有自动增量约束,这不会成为问题吗?
    • AUTOINCREMENT 不是约束,它只是一种在插入 NULL 时自动分配 ID 值的机制。
    • 很抱歉。我的意思是:我插入了 4 个条目。生成的 id 将为 1,2,3,4。然后我删除 id=2 的条目。我插入另一个项目:生成的 id 将为 2,因为现在没有自动增量。现在,按顺序排列的行 ID 是:1,3,4,2。当我尝试将其传输到具有自动增量的新表时,由于无法分配 2,最后一项(id=2)是否会被分配 id=5?这会影响外键关系。
    • 没有这个问题。阅读documentation
    猜你喜欢
    • 1970-01-01
    • 2016-09-24
    • 2017-04-03
    • 1970-01-01
    • 2021-01-15
    • 1970-01-01
    • 1970-01-01
    • 2011-04-29
    • 2015-12-19
    相关资源
    最近更新 更多