【问题标题】:UNIQUE contraint for more then One MySQL columns with Null Values具有 Null 值的多个 MySQL 列的唯一约束
【发布时间】:2013-01-13 17:14:24
【问题描述】:

在我的问题中,我的“个人”数据库​​中有两列。一列存储此人所属的组,一列存储他是该组的管理员。一次组只能有一个管理员。

我的想法是我应该在两列上放置一个独特的约束。但问题是,对于不是管理员的其他用户,他们的唯一约束被打破了。

问题的正确解决方案应该是什么。

示例数据库

----------------------------------
Person_id | Group_Id  |  Is_admin
----------------------------------
1         | 9         | null
2         | 9         | null
3         | 9         | null
4         | 9         | 1
5         | 9         | null
6         | 4         | null
7         | 4         | null
8         | 4         | null
9         | 4         | 1

现在,如果我对 Group_Id 和 Is_admin 应用唯一约束,它们是唯一的,但在此人不是管理员的情况下则不然。

【问题讨论】:

标签: mysql database


【解决方案1】:

考虑创建一个新表以包含有关您的组的信息,其中group_id 是主索引,而admin_id 之类的列作为外键引用您的person 表。这样一来,您就可以完全消除 is_admin 列,并拥有更相关的设计。

【讨论】:

  • 这位先生,总结了我的想法。另一种选择可能是通过触发器管理约束。
【解决方案2】:

对我来说没问题...

DROP TABLE IF EXISTS person_group;

CREATE TABLE person_group
(Person_id INT NOT NULL PRIMARY KEY
,Group_Id  INT NOT NULL
,Is_admin TINYINT NULL
,UNIQUE (group_id,is_admin)
);

INSERT INTO person_group VALUES
(1         , 9         , null),
(2         , 9         , null),
(3         , 9         , null),
(4         , 9         , 1),
(5         , 9         , null),
(6         , 4         , null),
(7         , 4         , null),
(8         , 4         , null),
(9         , 4         , 1);

SELECT * FROM person_group;
+-----------+----------+----------+
| Person_id | Group_Id | Is_admin |
+-----------+----------+----------+
|         6 |        4 |     NULL |
|         7 |        4 |     NULL |
|         8 |        4 |     NULL |
|         9 |        4 |        1 |
|         1 |        9 |     NULL |
|         2 |        9 |     NULL |
|         3 |        9 |     NULL |
|         5 |        9 |     NULL |
|         4 |        9 |        1 |
+-----------+----------+----------+

INSERT INTO person_group VALUES (10, 9, null);
Query OK, 1 row affected (0.00 sec)

INSERT INTO person_group VALUES (11, 9, null);
Query OK, 1 row affected (0.00 sec)

【讨论】:

  • 它给了我错误'#1062 - 键'is_admin'的重复条目'0'。我认为您在单个查询中插入了多个值,这就是它没有给出错误的原因。
  • 另一种可能性是你使用了 NULL 而我使用的是 0
  • @backTangent 一个独特的约束允许多个 NULL 值。您的问题包括 NULL 值,那么您为什么要谈论使用 0?
  • @TheVedge:实际上有两张表,一张为空,另一张为 zeors。第一个问题解决了,但我想讨论第二个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多