2010-09-10 115 views
1

我在rails 2.3.9上使用ruby。 rake db:migrate成功通過。但是,當我運行rake db:migrate:redo來測試下行部分時,我收到錯誤消息。我使用Innodb與MySQL。無法刪除外鍵約束

class AddConstraints < ActiveRecord::Migration 
    def self.up 
    ActiveRecord::Base.connection.execute <<-EOS 
     ALTER TABLE venues 
     ADD CONSTRAINT FOREIGN KEY (city_id) 
     REFERENCES cities (id) 
     ON DELETE restrict 
     ON UPDATE cascade 
    EOS 
    end 

    def self.down 
    ActiveRecord::Base.connection.execute <<-EOS 
     ALTER TABLE venues DROP FOREIGN KEY (city_id) 
    EOS 
    end 
end 

我得到的錯誤信息是

You have an error in your SQL syntax; check the manual 
that corresponds to your MySQL server version for the right 
syntax to use near '(city_id)' at line 1:  
ALTER TABLE venues DROP FOREIGN KEY (city_id) 

回答

2

首先,您應該省略FOREIGN KEY後的括號。其次,您必須告訴mysql您想要刪除的fk約束的名稱,而不是受該約束影響的列的名稱。如果您運行SHOW CREATE TABLE venues,則可以找出約束的名稱 - 可能類似venues_ibfk_1或類似的名稱。將該名稱用於ALTER TABLE語句,例如ALTER TABLE venues DROP FOREIGN KEY venues_ibfk_1

+1

我明白了。然而,這意味着不同的人對外鍵的不同會有所不同。這意味着沒有乾淨的方式來使用紅寶石軌道解決這個問題。除非我動態地找到正確的foreign_key。有沒有辦法告訴MySQL創建具有特定名稱的外鍵,或者完全取決於MySQL? – 2010-09-10 16:46:40

+0

不確定你的意思是「不同的人爲不同的名稱」。無論如何,您可以在創建外鍵時選擇其名稱,請參閱http://dev.mysql.com/doc/refman/5.0/zh-CN/create-table.html和http://dev.mysql.com /doc/refman/5.0/en/innodb-foreign-key-constraints.html(或您的MySQL版本的相應頁面)。 – titanoboa 2010-09-14 11:49:34

0

也許從語句刪除括號?快速谷歌顯示沒有在MySQL文檔中使用括號的語句。

+0

刪除偏差會導致不同的錯誤。 Mysql :: Error:將'./eii_development/venues'重命名爲'./eii_development/#sql2-85-101'(errno:152)時出錯:ALTER TABLE場地DROP FOREIGN KEY city_id – 2010-09-10 16:18:43

+0

已經很晚了,但很可能值得一提的是我有同樣的錯誤。然後事實證明,MySQL敏感地忽略了外鍵名稱的情況。 – 2013-06-06 19:42:43