【问题标题】:Unique constraint for combined columns queried with another column使用另一列查询的组合列的唯一约束
【发布时间】:2015-11-18 12:33:25
【问题描述】:

为组合列添加表约束

我有一个包含以下列的数据库表来存储联系方式

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

【问题讨论】:

  • 你用的是oracle还是postgresql还是mysql哪个数据库?
  • 目前我正在使用 Postgres,但欢迎任何答案
  • 然后删除反引号。它们在除 mysql 之外的任何 SQL 实现中都是错误的。而且 Postgres 有一个布尔数据类型,所以你不需要 tinyint 的东西。

标签: mysql database postgresql constraints


【解决方案1】:

你可以添加一个唯一的约束/索引来做到这一点:

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

【讨论】:

    猜你喜欢
    • 2012-05-17
    • 1970-01-01
    • 2012-04-26
    • 1970-01-01
    • 2013-03-25
    • 2017-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多