【问题标题】:SQLite Drop Column and Cascading DeleteSQLite 删除列和级联删除
【发布时间】:2013-08-17 14:40:27
【问题描述】:

我研究了如何使用 SQLite 删除列。由于缺少 DROP COLUMN 语句,我正在考虑使用以下解决方法:

Delete column from SQLite table

这涉及将所有数据移动到临时表中,删除原始数据,然后重新创建它。

如果我对要修改的表有级联删除依赖,如何防止任何依赖表丢失数据?

例如

CREATE TABLE A (
    id INTEGER PRIMARY KEY,
    name TEXT,
    dummy INTEGER
)

CREATE TABLE B (
    id INTEGER PRIMARY KEY,
    name TEXT,
    a_id INTEGER,
    FOREIGN KEY (a_id) REFERENCES A(id) ON DELETE CASCADE
)

假设我想从表 A 中删除列“虚拟”,但我不想影响表 B 中的任何行。可以这样做吗?

【问题讨论】:

    标签: sql sqlite ddl


    【解决方案1】:

    可以禁用外键约束@​​987654321@。 在删除记录之前执行PRAGMA foreign_keys = off

    【讨论】:

      【解决方案2】:

      级联删除基于记录(行)而不是属性(列)。删除虚拟列不会导致任何级联删除,因为您没有从父表中删除任何记录。

      【讨论】:

      • 感谢您的快速回复。虽然我没有专门删除一行,但我正在删除然后重新创建 A(由于 SQLite 缺少 DROP COLUMN 功能),但这不会影响 B?
      • 如果您正在删除表,那么您正在删除将驱动级联删除的记录。在删除并重新创建表 A 之前,您需要将表 B 中的数据复制到新的备份表中。然后您需要将数据复制回表 B。
      猜你喜欢
      • 2011-09-21
      • 2014-04-01
      • 2020-10-30
      • 2018-03-06
      • 2012-11-18
      • 2018-03-30
      • 1970-01-01
      • 2015-10-06
      • 1970-01-01
      相关资源
      最近更新 更多