【发布时间】:2010-05-05 12:01:43
【问题描述】:
我有一个包含种子数据的 XML 文件,我正在尝试将其加载到我的生产数据库中。
问题是我在 XML 文件中的不同数据类型/节点之间有关联,因此当从 Rails 加载到 MySQL 时,我需要指定的 ID 相同。
这在开发过程中可以很好地使用 SQLite,我只是在遍历 XML 文件中的每个节点后使用如下一行:
CardSet.connection.execute("UPDATE card_sets SET id = #{xml_set.attributes['id']} WHERE id = #{set.id}")
我的问题是:如何在为数据库播种时强制使用预设 ID,然后才能重新打开 auto_increment 以使 Rails 正常运行?
在创建数据库条目之前,我已经用这两行尝试过:
CardSet.connection.execute("ALTER TABLE card_sets CHANGE id id INT(11) DEFAULT NULL")
CardSet.connection.execute("ALTER TABLE card_sets DROP PRIMARY KEY")
之后:
CardSet.connection.execute("ALTER TABLE card_sets CHANGE id id INT(11) DEFAULT NULL auto_increment PRIMARY KEY")
哪个 MySQL 向我回击:
Mysql::Error: ALTER TABLE causes auto_increment resequencing, resulting in duplicate entry '18' for key 'PRIMARY': ALTER TABLE card_sets CHANGE id id INT(11) DEFAULT NULL auto_increment PRIMARY KEY
我的架构:
create_table "card_sets", :force => true do |t|
t.string "name"
t.datetime "created_at"
t.datetime "updated_at"
end
create_table "card_sets_cards", :id => false, :force => true do |t|
t.integer "card_set_id"
t.integer "card_id"
end
create_table "cards", :force => true do |t|
t.text "question", :default => ""
t.text "answer", :default => ""
t.datetime "created_at"
t.datetime "updated_at"
end
和模型:
class CardSet < ActiveRecord::Base
has_and_belongs_to_many :cards, :uniq => true
end
class Card < ActiveRecord::Base
has_and_belongs_to_many :card_set, :uniq => true
end
任何想法都将不胜感激。
【问题讨论】:
标签: mysql ruby-on-rails auto-increment seed