【问题标题】:Change column name in sqlite when other tables have foreign keys to it当其他表有外键时更改sqlite中的列名
【发布时间】:2014-08-19 20:00:09
【问题描述】:

我有一个名为 groups 的表,我想重命名其中的一列。到目前为止还可以。我知道 sqlite 不支持重命名列,所以我做了:

ALTER TABLE groups RENAME to tmp_groups;

CREATE TABLE groups(
    _ID integer primary key autoincrement,
    new_column_name integer
);

INSERT INTO groups(_ID, new_column_name) SELECT _ID, old_column_name FROM tmp_groups;

DROP TABLE tmp_groups;

但是,当我删除表 tmp_groups 时,具有 ON DELETE CASCADE 外键的表 members 的记录也被删除,所以我不得不执行以下操作:

  1. 创建一个表tmp_members,其列与成员相同,但没有外键;
  2. tmp_members 中插入来自 members 的记录;
  3. 删除表成员
  4. 从第一部分运行代码(使用 groups 表);
  5. 使用其外键重新创建表成员;
  6. 插入来自 tmp_membersmembers 数据;

伙计,那太累了!简单地重命名列的代码太多;

有没有更简单的方法来处理这个约束问题,或者这就是“sqlite方式”?

【问题讨论】:

    标签: android sql sqlite table-rename


    【解决方案1】:

    由于历史原因,SQLite 允许禁用外键约束(目前这甚至是默认设置)。

    在执行groups 表之前运行PRAGMA foreign_keys = off


    也可以使用PRAGMA writable_schema 重命名列,但只有在知道自己在做什么的情况下才应该这样做。

    【讨论】:

    • 这在 Android Sqlite 上对我有用。我运行了迁移并测试了所有内容。当我再次打开 foreign_keys 时,删除级联工作。它简化了很多!谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-21
    相关资源
    最近更新 更多