使用另一列

时间:2015-11-18 12:33:25

标签: mysql database postgresql constraints

为组合列添加表约束

我有一个数据库表,其中包含以下列以存储联系人详细信息

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

1 个答案:

答案 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