簡體   English   中英

sqlite數據庫中是否可以具有相同的索引名?

[英]Is it possible to have same index name within a sqlite database?

我有一個Ruby on Rails應用程序,開發數據庫在Mysql中。 我決定使用sqlite數據庫進行測試。 為此,我做了以下工作:

  1. 配置的database.yml文件支持test.sqlite3用於測試環境

  2. 使用rake db:schema:dump進行當前開發數據庫架構的rake db:schema:dump

  3. 嘗試使用schema.rb通過命令在test.sqlite3數據庫文件中生成表。 rake db:test:clone

然后它蓬勃發展。 我有一個例外

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) 。 有出路嗎?

您正在嘗試添加測試數據庫中已經存在的索引。 因此,約會db的索引已經存在於測試數據庫的患者表中。 您可以嘗試RAILS_ENV = test rake db:drop db:create db:test:clone,它應該可以正常運行。 也就是說,我喜歡在遷移中添加條件以避免問題。 例如:

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

對於所有神聖的事物,請不要將您的產品列重命名為pappointment_id或任何此類名稱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM