用另一列查询的组合列的唯一约束

Unique constraint for combined columns queried with another column

为组合列添加table约束条件

我有一个数据库table,其中包含用于存储详细联系信息的列

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 上最多可以有一个主要联系人?

您可以添加唯一的 constraint/index 来执行此操作:

create unique index unq_contacts_user_id_contact_type_is_primary
    on contact(user_id, contact_type, is_primary);

注意:这仅在 is_primary 取值“1”或 NULL 时有效。这个非常重要。否则,您将被限制为最多一个 "not primary" 联系人以及一个主要联系人。

在 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