在MySQL数据库中添加唯一性约束的范围可能吗?

时间:2012-08-16 17:46:00

标签: mysql ruby-on-rails validation rails-migrations

我有一个使用MySQL的Rails应用程序。

我在两个模型之间有has_many :through关联,如下所述:

class Category < ActiveRecord::Base
  has_many :category_pairings
  has_many :dishes, through: :category_pairings, :inverse_of => :categories
end

class Dish < ActiveRecord::Base
  has_many :category_pairings
  has_many :categories, through: :category_pairings, :inverse_of => :dishes
end

class CategoryPairing < ActiveRecord::Base
  belongs_to :dish
  belongs_to :category
end

所以在我的category_pairings表中我有这样的条目:

+---------+-------------+
| dish_id | category_id |
+---------+-------------+
|       3 |           5 |
|       3 |           1 |
|       2 |           1 |
+---------+-------------+

我想确保您无法再创建这样的条目:

+---------+-------------+
| dish_id | category_id |
+---------+-------------+
|       3 |           5 |
|       3 |           1 |
|       2 |           1 |
|       2 |           1 | <-- Illegal
+---------+-------------+

我知道有一种方法可以通过Rails实现这一点,但有没有办法通过MySQL来阻止这种情况?

我知道在MySQL中使用:

ALTER TABLE category_pairings
ADD UNIQUE (category_id);

但这样做会使整个表格中只有一个category_id

如果只能通过Rails实现这一点,那么为了做到这一点,我的新迁移会是什么样子?

这是我原始的迁移看起来像创建category_pairings表:

class CreateCategoryPairings < ActiveRecord::Migration
  def change
    create_table :category_pairings do |t|
      t.belongs_to :dish
      t.belongs_to :category

      t.timestamps
    end

    add_index :category_pairings, :dish_id
    add_index :category_pairings, :category_id
  end
end

1 个答案:

答案 0 :(得分:2)

您需要在这两个字段中添加唯一索引,如下所示:

ALTER TABLE category_pairings
ADD UNIQUE (dish_id, category_id);