sql - 使外键也成为 Rails 迁移中的主键

标签 sql ruby-on-rails database ruby-on-rails-4 rails-migrations

编辑:

从 Rails 的角度来看,我希望一个列是主键和外键。也就是说使用 references 方法的外键。我想做类似的事情:

def change
  create_table :VipPerson, id: false do |t|
    t.primary_key :person_id
    t.references :person, :id, column: :person_id

    t.timestamps
  end
end

我想要一个自定义主键,Rails 模型也使用它来指向 Person 模型(见下文)。这实际上与 sql 数据库使用的外键无关(正如 Demi Magus 所指出的,Rails 直到 Rails 4.2 才支持创建真正的外键)。

-

我想在我的 Rails 项目中实现多表交互 (MTI),从而像通常在关系数据库中那样实现继承:

table: Person
-------------
(PK) ID
Name
...

table: VipPerson (specalization of Person)
----------------
(PK) (FK) Person_ID
VIP-Status
...

为此,我需要编写一个迁移,将属性(此处为 Person_ID)同时声明为(自定义)主键和外键。我没有看到如何使用 Rails 的迁移 DSP 的方法来做到这一点。

我不想使用 Rails 的多态关联,因为我想保证数据库中的数据完整性。我知道我还需要自定义 Rails 模型,但我们先不谈这个话题。主要问题是如何编写使 PK 也成为 FK(反之亦然)的迁移。

最佳答案

外键关系仅适用于最新版本的 rails,如您在 release notes 中所见,为 4.2。 ,你可以像这样使用它

创建一个简单的外键

add_foreign_key :articles, :authors

生成:

ALTER TABLE "articles" ADD CONSTRAINT articles_author_id_fk FOREIGN KEY ("author_id") REFERENCES "authors" ("id")

您还应该知道 add_foreign_key 只会生成一个外键约束,而不是像 activerecord add_column 那样生成一个列

add_column :articles, :author_id, :integer

将生成:

ALTER TABLE "articles" ADD COLUMN author_id INT(11);

您可以找到更多信息 here

此外,如果您不只是在寻找 rails 的边缘,那么您会发现这个有用的 gem 可以让您做您正在寻找的事情,它是 composite_primary_keys ,唯一需要注意的是,您必须使用与您的 Rails 版本兼容的版本。

希望对你有帮助:D

关于sql - 使外键也成为 Rails 迁移中的主键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27883934/

相关文章:

sql - 在哪里可以找到有关第六范式的信息

database - 我可以在单个连接上创建支持多个数据库事务吗?

mysql - 复杂的 MYSQL 查询 4 ​​个表寻找 1 个结果

sql - 甲骨文 SQL : Why is my function outputting null?

ruby-on-rails - 在 Rails 中记录用户事件

ruby-on-rails - 在我的 Ruby on Rails 网站上线之前我应该​​检查什么?

database - 5亿条记录的大数据库

sql - 列复制和更新与列创建和插入

sql - 在 WiX 中为刚创建的应用程序池标识添加 SQL 权限

html - new.html.erb 看不到样式表的背景色