代码之家  ›  专栏  ›  技术社区  ›  keparo

如何从sqlite(3.6.21)表中删除约束?

  •  46
  • keparo  · 技术社区  · 16 年前

    我有下表:

    CREATE TABLE child( 
      id INTEGER PRIMARY KEY, 
      parent_id INTEGER CONSTRAINT parent_id REFERENCES parent(id), 
      description TEXT);
    

    如何删除约束?

    2 回复  |  直到 7 年前
        1
  •  77
  •   paxdiablo    7 年前

    sqlite不支持 alter table drop constraint 命令。您将需要创建一个没有约束的新表,传输数据,然后删除旧表。

    我认为以下几点应该有效:

    CREATE TABLE child2 ( 
        id INTEGER PRIMARY KEY, 
        parent_id INTEGER,
        description TEXT
    );
    INSERT INTO child2 (id, parent_id, description)
       SELECT id, parent_id, description FROM CHILD;
    DROP TABLE child;
    ALTER TABLE child2 RENAME TO child;
    

    请注意 insert into 可能被简化为 使用显式的列名称,但我已经这样做了,以防您还想更改结构。

    例如,如果你是 去除 限制 parent_id 纵队,把它放在那里有点可疑。在这种情况下,您可以将数据传输修改为:

    CREATE TABLE child2 (id INTEGER PRIMARY KEY, description TEXT);
    INSERT INTO child2 (id, description) SELECT id, description FROM CHILD;
    
        2
  •  8
  •   jftuga    12 年前

    我认为这是一种更简单、更简洁的方法:

    copy db.sqlite3 backup-db.sqlite3
    echo .dump tablename | sqlite3 db.sqlite3 > modify.sql
    (now delete or change the constraint in modify.sql)
    echo drop table tablename; | sqlite3 db.sqlite3 
    sqlite3 db.sqlite3 < modify.sql
    

    现在您可以缩小新的数据库表并比较不同之处。

    推荐文章