如果其他列具有相同值,则对唯一列进行约束

Sam*_*ick 3 mysql group-by unique-constraint

我想知道是否可以让一个列对于 MySQL 中另一列的每个值都是唯一的。我想要拥有与 a 相同的功能GROUP BY

这是表格:

CREATE TABLE Example (
    id INT,
    name VARCHAR(100) NOT NULL
);
Run Code Online (Sandbox Code Playgroud)

数据将与此类似:

INSERT INTO Example (id, name) VALUES(1, 'Peter Parker');
Run Code Online (Sandbox Code Playgroud)

以下内容将起作用:

INSERT INTO Example (id, name) VALUES(1, 'Bruce Wayne');
INSERT INTO Example (id, name) VALUES(2, 'Peter Parker');
Run Code Online (Sandbox Code Playgroud)

以下内容不起作用(因为该 id 具有相同的名称):

INSERT INTO Example (id, name) VALUES(1, 'Peter Parker');
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助澄清我想要的事情:

  • 可以有多行具有相同的 ID
  • 可以有多行具有相同的名称
  • 不能有多行具有相同的 ID名称

Vér*_*ace 5

如果我理解正确的话,你想要的是这样的:

CREATE TABLE Example (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    UNIQUE KEY uix_name_example (name)
);
Run Code Online (Sandbox Code Playgroud)

id字段是PRIMARY KEY,其值由服务器处理。on确保不允许重复 - 并确保(希望)有意义UNIQUE KEY的值。nameNOT NULL

INSERT INTO Example (name) VALUES ('Peter Parker'); -- specify name, but not id - it's automatic
INSERT INTO Example (name) VALUES ('Billy Joe McAlister');
INSERT INTO Example (name) VALUES ('Bill Clinton');
Run Code Online (Sandbox Code Playgroud)

检查你的桌子:

mysql> SELECT * FROM Example;
+----+---------------------+
| id | name                |
+----+---------------------+
|  3 | Bill Clinton        |
|  2 | Billy Joe McAlister |
|  1 | Peter Parker        |
+----+---------------------+
3 rows in set (0.03 sec)
Run Code Online (Sandbox Code Playgroud)

随后对INSERT同名(彼得·帕克)的尝试失败了。

mysql> INSERT INTO Example (name) VALUES('Peter Parker');
ERROR 1062 (23000): Duplicate entry 'Peter Parker' for key 'uix_name_example'
mysql> 
Run Code Online (Sandbox Code Playgroud)

如果您想允许具有相同名称但不同 ID 的人,那么您只需UNIQUE KEY uix_name_example (name)在表定义中省略该行即可。

mysql> INSERT INTO Example VALUES(1, 'Peter Parker');
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
mysql>
Run Code Online (Sandbox Code Playgroud)

如果这不是令人满意的解释,请扩展您的问题。


(编辑回应OP的评论和澄清)

您想要的是组合 id 和 name 字段上的UNIQUE KEY(或INDEX) - 也称为复合索引(或键)。其语法如下:

CREATE TABLE Example2 (
    id INT NOT NULL,
    name VARCHAR(100) NOT NULL,
    UNIQUE KEY uix_example (id, name)
);
Run Code Online (Sandbox Code Playgroud)

允许插入具有不同名称的重复 ID。

mysql> INSERT INTO Example2 VALUES(1, 'Peter Parker');
Query OK, 1 row affected (0.12 sec)
mysql> INSERT INTO Example2 VALUES(1, 'Billy Power');
Query OK, 1 row affected (0.08 sec)
Run Code Online (Sandbox Code Playgroud)

允许使用不同的 id 插入相同的名称

mysql> INSERT INTO Example2 VALUES(1, 'Mary Hanlon');
Query OK, 1 row affected (0.06 sec)

mysql> INSERT INTO Example2 VALUES(2, 'Mary Hanlon');
Query OK, 1 row affected (0.06 sec)
Run Code Online (Sandbox Code Playgroud)

但是,不允许插入相同的 id相同的名称。

mysql> INSERT INTO Example2 VALUES(1, 'Peter Parker');
ERROR 1062 (23000): Duplicate entry '1-Peter Parker' for key 'uix_example'
mysql> 
Run Code Online (Sandbox Code Playgroud)

希望这能解决您的问题。