Ruby on Rails迁移,两个主键但只有一个自动递增

时间:2011-07-20 14:28:26

标签: mysql ruby-on-rails ruby

我正在构建一个RoR多租户应用程序。因此,应用程序数据库可以托管在不同的地方,可以拆分或重新合并。这就是为什么我需要几个主键:一个经典的自动增加的id和另一个我的主要模型的外键(不能被诅咒)。

我想做那样的事情:

create_table :table_name do |t|
  t.primary_key :id
  t.primary_key :second_id, :auto_increment => false
  # ...
  t.timestamps
end 

但我找不到正确的语法,任何想法?

修改:我希望通过迁移来实现!

3 个答案:

答案 0 :(得分:2)

桌面上不能有两个主键。

你可以拥有两个候选密钥(在MySQL中称为密钥唯一索引/约束在其他数据库中)

如果您愿意,可以使用由两个字段组成的复合主键。我认为这是mySQL primary key (fieldA,fieldB)

中的语法

然而,当其中一个字段是自动增量时,执行复合键是没有意义的。由于自动增量本身是唯一的,并且除id以外的每个属性都会对它有功能依赖。在主键中包含second_id对你没有任何帮助。

答案 1 :(得分:0)

CREATE TABLE testtst

id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,

second_id INT NOT NULL,

timest DATE NOT NULL,

独特( second_id

)ENGINE = MYISAM;

这是吗?

答案 2 :(得分:0)

经过大量的研究和测试,我认为用经典的迁移做到这一点是不可能的。但我找到了继续使用迁移管理数据库的解决方案。可以使用execute命令包含SQL片段。

所以,我的创作看起来像那样:

def self.up

  execute "CREATE TABLE `table_name` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `org_id` int(11) NOT NULL,
    `created_at` datetime DEFAULT NULL,
    `updated_at` datetime DEFAULT NULL,
    PRIMARY KEY (`id`, `org_id`)
  ) ENGINE=InnoDB AUTO_INCREMENT=151 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;"

end

def self.down
  drop_table :table_name
end

它不是很漂亮,但是它可以完成这项工作。