Mysql 无法删除外键约束

Mysql 无法删除外键约束,mysql,ruby-on-rails,Mysql,Ruby On Rails,我正在使用RubyonRails 2.3.9。rake db:migrate已成功通过。但是,当我运行rakedb:migrate:redo来测试停机部分时,我会收到错误消息。我在Innodb中使用mysql class AddConstraints < ActiveRecord::Migration def self.up ActiveRecord::Base.connection.execute <<-EOS ALTER TABLE venues

我正在使用RubyonRails 2.3.9。rake db:migrate已成功通过。但是,当我运行rakedb: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

也许把括号从语句中去掉?google快速显示了MySQL文档中没有使用括号的语句。

首先,您应该省略
外键后的括号。其次,必须告诉mysql要删除的fk约束的名称,而不是受该约束影响的列的名称。如果运行
SHOW CREATE TABLE viouses
,可以找到约束的名称-可能类似于
viouses\u ibfk\u 1
或类似的名称。将此名称用于
ALTER TABLE
语句,例如
ALTER TABLE VICENTES DROP外键VICENTES\u ibfk\u 1

删除偏执会导致不同的错误。Mysql::错误:将“/eii_development/Vinces”重命名为“/eii_development/#sql2-85-101”时出错(错误号:152):更改表场馆删除外键city_idIt已经很晚了,但可能值得注意的是,我也有相同的错误。后来发现,MySQL非常敏感地排除了外键名称的大小写。我明白了。然而,这意味着外键的名称对于不同的人是不同的。这意味着使用ruby rails无法解决这个问题。除非我动态地找到正确的外键。有没有办法告诉mysql用一个特定的名字创建外键,还是完全由mysql来创建?不知道“不同的人有不同的名字”是什么意思。无论如何,您可以在创建外键时选择它的名称,请参见和(或您的MySQL版本的相应页面)。
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)