class AddUniqeConstraintToShipments < ActiveRecord::Migration
def up
execute <<-SQL
alter table shipments
add constraint shipment_tracking_number unique (tracking_number, carrier);
SQL
end
def down
execute <<-SQL
alter table shipments
drop constraint if exists shipment_tracking_number;
SQL
end
end
假设我们有一个属于某个广告客户的Locations表,该表具有列reference_code,而您只希望每个广告客户有一个引用代码,因此您希望为列组合添加一个唯一约束并对其命名。 执行: rails g migration AddUniquenessConstraintToLocations 让您的迁移看起来像这样一行代码:
class AddUniquenessConstraintToLocations < ActiveRecord::Migration[5.2]
def change
add_index :locations, [:reference_code, :advertiser_id], unique: true, name: 'uniq_reference_code_per_advertiser'
end
end
或此块版本。
class AddUniquenessConstraintToLocations < ActiveRecord::Migration[5.2]
def change
change_table :locations do |t|
t.index ['reference_code', 'advertiser_id'], name: 'uniq_reference_code_per_advertiser', unique: true
end
end
end
或此原始SQL版本
class AddUniquenessConstraintToLocations < ActiveRecord::Migration[5.2]
def change
execute <<-SQL
ALTER TABLE locations
ADD CONSTRAINT uniq_reference_code_per_advertiser UNIQUE (reference_code, advertiser_id);
SQL
end
end
7条答案
按热度按时间jaxagkaj1#
add_index :people, [:firstname, :lastname, :dob], unique: true
bjg7j2ky2#
根据howmanyofme.com的数据,仅在美国就有“46,427个叫约翰·史密斯的人”。这大约是127年的天数。由于这远远超过了人类的平均寿命,这意味着出生日期冲突在数学上是肯定的。
我想说的是,这种独特字段的特定组合可能会在未来导致用户/客户极度沮丧。
考虑一些实际上是唯一的东西,如国家身份证号码,如果合适的话。
(我意识到我写这篇文章已经很晚了,但它可能会对未来的读者有所帮助。)
ddrv8njm3#
您可能希望添加一个没有索引的约束。这将取决于您使用的数据库。以下是Postgres的示例迁移代码。
(tracking_number, carrier)
是您希望用于约束的列的列表。您可以添加不同的约束。阅读文档
dgsult0t4#
为了完整起见,也为了避免混淆,这里有3种方法可以做同样的事情:
假设我们有一个属于某个广告客户的Locations表,该表具有列reference_code,而您只希望每个广告客户有一个引用代码,因此您希望为列组合添加一个唯一约束并对其命名。
执行:
rails g migration AddUniquenessConstraintToLocations
让您的迁移看起来像这样一行代码:
或此块版本。
或此原始SQL版本
其中任何一个都将具有相同的结果,请检查您的
schema.rb
50pmv0ei5#
例如,您可以在迁移中为列添加唯一索引
或为每列单独创建唯一索引
wfsdck306#
在用户和帖子之间的连接表的典型示例中:
尝试创建两个相似的记录会抛出一个数据库错误(在我的例子中是Postgres):
例如:
完全可运行的示例:https://gist.github.com/Dorian/9d641ca78dad8eb64736173614d97ced
生成的
db/schema.rb
:https://gist.github.com/Dorian/a8449287fa62b88463f48da986c1744atquggr8v7#
如果您正在创建一个新表,只需添加unique:真