【问题标题】:Two Foreign Keys raise "Can' create table" on MySQL AUTO_INCREMENT PRIMARY KEY两个外键在 MySQL AUTO_INCREMENT PRIMARY KEY 上引发“Can' create table”
【发布时间】:2016-12-22 18:14:05
【问题描述】:

我创建了一个包含以下内容的迁移文件.. 它适用于 SQLite,但当我切换到 MySQL 时,出现“无法创建表”错误(见下文)。

class CreateVisits < ActiveRecord::Migration[5.0]
  def change
    create_table :visits, :primary_key => :id do |t|
      t.references :user, foreign_key: true
      t.references :visitor, foreign_key: "User"
      t.timestamps
    end
    add_index :visits, [:user_id, :visitor_id], unique: true
  end
end

MySQL 抛出错误:

Mysql2::Error: Can't create table 'myapp_development.visits' (errno: 150): 
CREATE TABLE `visits` (
`id` int AUTO_INCREMENT PRIMARY KEY, 
`user_id` int, 
`visitor_id` int, 
`created_at` datetime NOT NULL, 
`updated_at` datetime NOT NULL,  
INDEX `index_visits_on_user_id`  (`user_id`),  
INDEX `index_visits_on_visitor_id`  (`visitor_id`), 
CONSTRAINT `fk_rails_09e5e7c20b`
FOREIGN KEY (`user_id`)
  REFERENCES `users` (`id`), 
CONSTRAINT `fk_rails_b156c396f4`
FOREIGN KEY (`visitor_id`)
  REFERENCES `visitors` (`id`)
) 

ENGINE=InnoDB

欢迎提出想法!

【问题讨论】:

  • 在创建visits 表之前,您是否创建了users 表和visitors 表?
  • users 表之前已创建。访问表包含 2 列:user_id 和 visitor_id,它们都与用户表中的 1 条记录相关
  • visitors 表怎么样?这看起来像 mysql 正在尝试创建引用,但找不到它试图引用的表之一
  • 没有visitors表。
  • 您的提示很好,我已将引用更改为整数并且它有效。谢谢!

标签: mysql ruby-on-rails activerecord rails-migrations


【解决方案1】:

当您尝试引用不存在的表时,通常会引发 150 错误。

在您的情况下,您将两个外键引用到 users 表中的同一主键。

但在这种情况下,您不能只使用foreign_key: true。但是你可以通过再添加两行来做到这一点

def change
  create_table :visits, :primary_key => :id do |t|
    t.references :user, references: :visits
    t.references :visitor, references: :visits
    t.timestamps
  end

  add_foreign_key :visits, :users, column: :user_id
  add_foreign_key :visits, :users, column: :visitor_id
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-14
    • 2017-09-03
    • 2018-10-04
    • 1970-01-01
    相关资源
    最近更新 更多