首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails迁移创建表主键

问Rails迁移创建表主键
EN

Stack Overflow用户
提问于 2011-01-23 02:31:37
回答 5查看 31.5K关注 0票数 17

我正在编写一个迁移脚本来创建表,该表具有一个名为guid且为VARCHAR(25)的主键列。问题是,我觉得我必须加倍努力,才能在一步内实现本应可能实现的目标。

如果我运行:

代码语言:javascript
复制
create_table(:global_feeds, :primary_key => 'guid') do |t|
  t.string :guid, :limit => 25
  t.text :title
  t.text :subtitle

  ...

  t.timestamps
end

我得到一个主键为guid的表,没有名为id的列(这就是我想要的)。但是,问题是guid列是打开了自动增量的INT(11)。因此,我必须运行一个额外的命令:

代码语言:javascript
复制
change_column :global_feeds, :guid, :string, :limit => 25

运行两个SQL命令来获得我认为在一个命令中应该可以实现的东西,这似乎有点复杂。

对如何优化这一点有什么建议吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-01-23 02:58:28

我想您正在使用mySQL,所以这里是您可以尝试的

代码语言:javascript
复制
create_table :global_feeds, {:id => false} do |t|
  t.string :guid
  t.text :title
  t.text :subtitle
  t.timestamps
end
execute "ALTER TABLE global_feeds ADD PRIMARY KEY (guid);"

如果您使用的不是mySQL,那么应该在execute命令中更改查询,以便在您的DB引擎上工作。不过,我不确定你能否在SQLite上做到这一点。别忘了把这一行放在global_feed.rb模型的某个地方:

代码语言:javascript
复制
set_primary_key :guid

无论如何,当您坚持Rails的约定时,您可以最大限度地利用Rails。更改主键名称和类型可能不是一个好主意。

票数 22
EN

Stack Overflow用户

发布于 2015-04-21 15:14:55

在Rails 4中,你可以做到;

代码语言:javascript
复制
create_table :global_feeds, id: false do |t|
  t.string :guid, primary_key: true
 ...
end
票数 29
EN

Stack Overflow用户

发布于 2011-01-23 02:59:52

您需要使用#column而不是#string。例如:

代码语言:javascript
复制
create_table(:global_feeds, :primary_key => 'guid') do |t|
  t.column :guid, "varchar(25)", :null => false
  ...
end

请注意,除了MySQL之外,varchar类型不能移植到其他数据库。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4769725

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档