为组合列添加表约束
我有一个数据库表,其中包含以下列以存储联系人详细信息
CREATE TABLE `contacts` (
`id` int(11),
`user_id` int(11), -- Foreign key to user table
`contact_type` enum('Email', 'Phone', 'Address') -- Possible values
`contact` varchar(100),
`is_verified` tinyint(1), -- Boolean
`is_primary` tinyint(1), -- Boolean
PRIMARY KEY (`id`)
);
是否可以在is_primary
列上设置约束,以便一个用户可以在每个contact_type
上拥有最多一个主要联系人?
答案 0 :(得分:3)
您可以添加唯一约束/索引来执行此操作:
create unique index unq_contacts_user_id_contact_type_is_primary
on contact(user_id, contact_type, is_primary);
注意:仅当is_primary
采用值“1”或NULL
时才有效。这是非常重要的。否则,您将被限制为最多一个“非主要”联系人以及一个主要联系人。
在Postgres(或Oracle)中,您将使用过滤索引:
create unique index unqf_contacts_user_id_contact_type
on contact(user_id, contact_type)
where is_primary = 1; -- or however you specify that it is true