我刚才问了一个问题create unique constraints per user,答案非常简单。
为了在列上创建唯一索引,但是基于每个用户,我所要做的就是:
unique [:user_id, :name] # SQL syntax: UNIQUE (user_id, name)
但是用户表和引用user_id
的表之间的关系是1:n(用户到位置),所以我在foreign_key
表中有一个location
参考user_id
。这个问题是关于两个表之间的n:m关系,并在其中一个表上添加唯一约束。
Sequel.migration do
change do
Sequel::Model.db.run 'CREATE EXTENSION IF NOT EXISTS "uuid-ossp"'
create_table :customer do
String :id, :type => :uuid, :primary_key => true, :default => Sequel.function(:uuid_generate_v4)
DateTime :created_at
DateTime :updated_at
index :id, :unique => true
end
end
end
Sequel.migration do
change do
Sequel::Model.db.run 'CREATE EXTENSION IF NOT EXISTS "uuid-ossp"'
create_table :role do
String :id, :type => :uuid, :primary_key => true, :default => Sequel.function(:uuid_generate_v4)
String :name, :unique => true, :null => false # TODO: unique, per customer
DateTime :created_at
DateTime :updated_at
unique [:customer_id, :name]
index :id, :unique => true
full_text_index :name, :index_type => :gist
end
end
end
上面的代码说明了我提到的两个表有一个n:m关系(客户到角色),下表说明了连接表和两个表的外键:
Sequel.migration do
change do
Sequel::Model.db.run 'CREATE EXTENSION IF NOT EXISTS "uuid-ossp"'
create_table :customer_role do
String :id, :type => :uuid, :primary_key => true, :default => Sequel.function(:uuid_generate_v4)
foreign_key :customer_id, :customer, :type => :uuid
foreign_key :role_id, :role, :type => :uuid
index :id, :unique => true
end
end
end
我想要做的是在UNIQUE (customer_id, :name)
表上声明一个唯一约束,例如role
。但我不能这样做,那么我该如何以另一种方式实现呢?
答案 0 :(得分:1)
我想要做的是宣布一个独特的约束,例如 角色表上的UNIQUE(customer_id,:name)。但我不能这样做, 那么我该如何以另一种方式实现呢?
您的问题的本质似乎是列role.customer_id不存在。事实上,我很确定列不应该存在,因此该部分实际上是好的。
至少,你需要
unique [:customer_id, :role_id]
“customer_role”中的。