【发布时间】:2011-10-16 23:40:36
【问题描述】:
如果我在创建索引后重命名 SQLite 表/列/行,旧索引是否仍然有效?
谢谢!
【问题讨论】:
标签: sql database sqlite database-design format
如果我在创建索引后重命名 SQLite 表/列/行,旧索引是否仍然有效?
谢谢!
【问题讨论】:
标签: sql database sqlite database-design format
如果您使用ALTER TABLE 和RENAME TO 重命名表,那么如this page(来自sqlite 文档)所述,索引仍然有效:
SQLite 中的 ALTER TABLE 命令允许用户重命名表 [...] 如果要重命名的表有触发器或索引,那么这些在重命名后仍会附加到表。
但请注意,不允许重命名列。这是SQL features not implemented by sqlite 之一:
仅支持 ALTER TABLE 命令的 RENAME TABLE 和 ADD COLUMN 变体。省略了其他类型的 ALTER TABLE 操作,例如 DROP COLUMN、ALTER COLUMN、ADD CONSTRAINT 等。
行没有名称(除非有 PK),因此实际上没有办法重命名它们。
【讨论】:
我强烈建议使用 Rails ActiveRecord 迁移来维护您的数据库。这可以在 Rails 之外完成。因此,您的应用无需成为 Rails 应用即可使用 rake 任务
在此处查看有关如何执行此操作的优秀博客http://exposinggotchas.blogspot.com/2011/02/activerecord-migrations-without-rails.html
【讨论】:
是的,旧索引仍然可以使用。
请注意,sqlite 并不关心索引的名称。最初创建索引时,它们通常以表和字段命名,因此当您重命名表时,索引中仍会保留旧表的名称。这可能会导致问题,例如:
重命名旧表:
sqlite3 "$DB" "PRAGMA busy_timeout=20000; ALTER TABLE '$TABLE' RENAME TO '$TABLE"_backup"'"
这将导致错误,即索引已存在。
解决方案:也重命名索引,或者在重新导入原始表之前将它们从重命名的表中删除(参见this answer)。
【讨论】: