【发布时间】:2015-03-16 08:46:14
【问题描述】:
在我的 iOS 应用中,我想更改数据库中的列数据类型。
ALTER TABLE XXX ALTER COLUMN myColumn INT.
我总是得到“接近 ALTER 语法错误” 如何解决问题? 感谢您的帮助。
【问题讨论】:
-
您使用的是哪个数据库? sqlite3?
-
是的,如何解决这个错误?
在我的 iOS 应用中,我想更改数据库中的列数据类型。
ALTER TABLE XXX ALTER COLUMN myColumn INT.
我总是得到“接近 ALTER 语法错误” 如何解决问题? 感谢您的帮助。
【问题讨论】:
ALTER TABLE table ADD newColumn INTEGER;UPDATE table SET newColumn = oldColumn;【讨论】:
您无法更改列类型。您可以创建一个新表,这次使用该列的正确数据类型,然后从旧表中选择数据并将其插入到新表中。 ALTER TABLE documentation 中概述了完整的过程:
记住与表 X 关联的所有索引和触发器的格式。下面的第 7 步将需要这些信息。一种方法是运行如下查询:
SELECT type, sql FROM sqlite_master WHERE tbl_name='X'。使用
CREATE TABLE构造一个新表“new_X”,该表采用所需的表 X 修订格式。当然,请确保名称“new_X”不会与任何现有表名冲突。使用如下语句将内容从 X 传输到 new_X:
INSERT INTO new_X SELECT ... FROM X。如果启用了外键约束,请使用
PRAGMA foreign_keys=OFF禁用它们。删除旧表 X:
DROP TABLE X。使用
ALTER TABLE new_X RENAME TO X将 new_X 的名称更改为 X。使用
CREATE INDEX和CREATE TRIGGER重建与表X 关联的索引和触发器。或许可以使用从上述步骤1 中保存的触发器和索引的旧格式作为指导,根据更改进行适当的更改。如果最初启用了外键约束(在第 4 步之前),则运行
PRAGMA foreign_key_check以验证架构更改没有破坏任何外键约束,并运行PRAGMA foreign_keys=ON以重新启用外键约束。如果有任何视图以受架构更改影响的方式引用表 X,则使用
DROP VIEW删除这些视图,并使用CREATE VIEW使用任何必要的更改重新创建它们以适应架构更改。
注意,SQLite 使用type affinity(列定义不会改变您插入表中的数据类型)。因此,如果您更改数据类型,您也需要更改数据。
【讨论】: