【问题标题】:Change the primary key of a table in SQLite在 SQLite 中更改表的主键
【发布时间】:2013-06-03 15:38:09
【问题描述】:

我有下表:

[id,lang,data]

主键是id

我想将主键更改为id,lang,而不会丢失表的内容。我必须运行什么查询才能更改它

谢谢

【问题讨论】:

标签: android sql sqlite


【解决方案1】:

根据@GarnerJosh 的评论,您不能运行单个命令来更改它 - SQLite 不允许更改现有的表结构。相反,使用复合主键创建一个新表并将数据复制过来:

CREATE TABLE my_table_copy( 
    id INTEGER, 
    lang INTEGER,
    data TEXT,
    PRIMARY KEY (id, lang)
);
INSERT INTO my_table_copy (id, lang, data)
   SELECT id, lang, data FROM my_table;
DROP TABLE my_table;
ALTER TABLE my_table_copy RENAME TO my_table;

【讨论】:

  • 不错的答案,在这种情况下,请确保您没有从您的 onUpgrade() 再次调用 onCreate(db),如果您这样做,那么应用程序将再次尝试创建您的表,这将导致 sqliteException ,表已经退出。因此,为了避免这种情况,只需删除并创建您想要更改的那些表。谢谢 PinnyM 和 GamerJosh
  • Sqlite 文档中有关于这个方法的详细信息:sqlite.org/lang_altertable.html"Making Other Kinds Of Table Schema Changes"
  • 在我的测试系统上,使用INSERT INTO my_table_copy (id, lang, data) SELECT id, lang, data FROM my_table ORDER BY (id,lang); 可以将较大表(约 100k 行)的查询速度提高 2 倍。
猜你喜欢
  • 2011-06-29
  • 2022-11-21
  • 2021-02-04
  • 1970-01-01
  • 2020-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-27
相关资源
最近更新 更多