mysql - 是否可以在 sqlite 数据库中使用相同的索引名称?

标签 mysql ruby-on-rails database sqlite schema.rb

我有一个 Ruby on Rails 应用程序,开发数据库在 Mysql 中。我决定使用 sqlite 数据库进行测试。为此,我执行了以下操作:

  1. 配置database.yml文件支持测试环境的test.sqlite3

  2. 使用 rake db:schema:dump

    转储当前开发数据库模式
  3. 尝试使用 schema.rb 通过命令在 test.sqlite3 数据库文件中生成表。 rake 数据库:测试:克隆

然后它轰隆隆地响了起来。我有一个异常(exception)

SQLite3::SQLException index XXX
already exists:CREATE INDEX "XXX" ON table ("XXX")

当我仔细查看迁移文件和架构时,我意识到在多个表中使用了相同的索引名称。比如schema.rb中的一些语句是这样的:

add_index("patients", ["appointment_id"], {:name=>"appointment_id"})
add_index("doctors", ["appointment_id"], {:name=>"appointment_id"})

我知道mysql在一个表的范围内维护索引名的唯一性。现在一个简单的解决方案可能是将测试数据库恢复为 mysql。我无法弄清楚的是,在这种特殊情况下是否有可能从 schema.rb 生成一个 sqlite 文件。

奇怪的部分来了。我进行了以下更改并在虚拟应用程序中进行了测试。

add_index("patients", ["appointment_id"], {:name=>"pappointment_id"})
add_index("doctors", ["appointment_id"], {:name=>"dappointment_id"})

成功了!现在我可能会想在我的真实应用程序中做同样的事情。严酷的现实是,在生产环境中,我需要在很多地方进行重命名,这不仅仅是一项乏味的任务,因为如果我删除旧索引并添加新索引,我们有数百万条记录会受到影响(Mysql 5.5) .有出路吗?

最佳答案

您正在尝试添加一个已存在于您的测试数据库中的索引。因此 appointment_id 的索引已经存在于您的测试数据库的患者表中。您可以尝试 RAILS_ENV=test rake db:drop db:create db:test:clone 它应该可以正常运行。那就是说我喜欢在我的迁移中添加条件以避免出现问题。例如:

add_column :patients, :appointment_id, :integer unless column_exists? :patients, :appointment_id

为了所有神圣的爱,请不要将您的 prod 列重命名为 pappointment_id 或任何类似的东西。

关于mysql - 是否可以在 sqlite 数据库中使用相同的索引名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32571597/

相关文章:

php - 在 foreach 循环内运行第二个查询?

mysql - 如何将 TIME() 函数过滤的 mysql 查询转换为 laravel 查询生成器?

database - 用于数据库操作的 Windows 文件系统有多快?

android - 如何通过SDK显示手机的SQLite数据库?

java - 如何在运行时知道 POJO 的 ID (@GeneratedValue)

java - 如何自动增加MySQL表中的列?

mysql - 合并行并在同一查询中获取其他数据

ruby-on-rails - Ruby:水龙头不工作?

jquery - 满足条件时跳过某些字段的验证

ruby-on-rails - 没有路线匹配[GET] “/logout” [rails]