我正在构建一个RoR多租户应用程序。因此,应用程序数据库可以托管在不同的地方,可以拆分或重新合并。这就是为什么我需要几个主键:一个经典的自动增加的id和另一个我的主要模型的外键(不能被诅咒)。
我想做那样的事情:
create_table :table_name do |t|
t.primary_key :id
t.primary_key :second_id, :auto_increment => false
# ...
t.timestamps
end
但我找不到正确的语法,任何想法?
修改:我希望通过迁移来实现!
答案 0 :(得分:2)
桌面上不能有两个主键。
你可以拥有两个候选密钥(在MySQL中称为密钥唯一索引/约束在其他数据库中)
如果您愿意,可以使用由两个字段组成的复合主键。我认为这是mySQL primary key (fieldA,fieldB)
然而,当其中一个字段是自动增量时,执行复合键是没有意义的。由于自动增量本身是唯一的,并且除id
以外的每个属性都会对它有功能依赖。在主键中包含second_id对你没有任何帮助。
答案 1 :(得分:0)
CREATE TABLE test
。tst
(
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
它不是很漂亮,但是它可以完成这项工作。