【问题标题】:Renaming SQLite Tables/Columns/Rows after indices have been created创建索引后重命名 SQLite 表/列/行
【发布时间】:2011-10-16 23:40:36
【问题描述】:

如果我在创建索引后重命名 SQLite 表/列/行,旧索引是否仍然有效?

谢谢!

【问题讨论】:

    标签: sql database sqlite database-design format


    【解决方案1】:

    如果您使用ALTER TABLERENAME 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),因此实际上没有办法重命名它们。

    【讨论】:

    • 有没有办法将信息从一列复制到另一列,然后删除第一列?
    • 在重命名列时看到这个other SO question
    • 我实际上只是在看那个:)。第一个答案看起来不错,但我应该如何处理索引?
    • 我认为您需要手动重新创建它们。 sql FAQ 提供了有关如何在开始该过程之前获取现有索引列表的说明。
    【解决方案2】:

    我强烈建议使用 Rails ActiveRecord 迁移来维护您的数据库。这可以在 Rails 之外完成。因此,您的应用无需成为 Rails 应用即可使用 rake 任务

    在此处查看有关如何执行此操作的优秀博客http://exposinggotchas.blogspot.com/2011/02/activerecord-migrations-without-rails.html

    【讨论】:

      【解决方案3】:

      是的,旧索引仍然可以使用。

      请注意,sqlite 并不关心索引的名称。最初创建索引时,它们通常以表和字段命名,因此当您重命名表时,索引中仍会保留旧表的名称。这可能会导致问题,例如:

      • 转储表格
      • 重命名旧表:

        sqlite3 "$DB" "PRAGMA busy_timeout=20000; ALTER TABLE '$TABLE' RENAME TO '$TABLE"_backup"'"
        
      • 重新导入转储表

      这将导致错误,即索引已存在

      解决方案:也重命名索引,或者在重新导入原始表之前将它们从重命名的表中删除(参见this answer)。

      【讨论】:

        猜你喜欢
        • 2019-01-07
        • 1970-01-01
        • 2016-03-15
        • 1970-01-01
        • 1970-01-01
        • 2018-02-21
        • 2015-11-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多