Server5.7中约束为“unique”的列如何接受重复值

fruv7luv  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(260)

问题是我将约束“unique”设置为现有表“info”的“hobby”列。当我使用以下语法添加一个新条目时:

mysql> update info
    -> set hobby="HACKING"
    -> where name = "TAYLOR";
Query OK, 1 row affected (0.08 sec)
Rows matched: 1  Changed: 1  Warnings: 0

添加时没有任何错误。当我已经在“爱好”上添加了“独特”约束时,这怎么可能呢?以下是表格的所有详细信息:

mysql> select * from info;
+-----+-----------+---------+-------+-----------+
| id  | name      | address | marks | hobby     |
+-----+-----------+---------+-------+-----------+
| 501 | JAMES     | DELHI   |   100 | GOLF      |
| 502 | TAYLOR    | MUMBAI  |    58 | HACKING   |
| 503 | MARTIN    | GOA     |    98 | CHESS     |
| 504 | ROBIN     | HARYANA |    68 | LUDO      |
| 505 | VIRAT     | UP      |    48 | CRICKET   |
| 506 | GAYLE     | MP      |    58 | cricket   |
| 507 | PRINCE    | KERALA  |    63 | ADVENTURE |
| 508 | ANONYMOUS | USA     |    72 | HACKING
  |
+-----+-----------+---------+-------+-----------+
8 rows in set (0.00 sec)

    mysql> show create table info;
    +-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | Table | Create Table                                                                                                                                                                                                                                                                                                                        |
    +-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | info  | CREATE TABLE `info` (
      `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `name` varchar(45) NOT NULL,
      `address` varchar(64) NOT NULL,
      `marks` int(65) unsigned DEFAULT NULL,
      `hobby` varchar(25) DEFAULT NULL,
      PRIMARY KEY (`id`),
      UNIQUE KEY `id` (`id`,`hobby`)
    ) ENGINE=InnoDB AUTO_INCREMENT=509 DEFAULT CHARSET=utf8 |
    +-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    1 row in set (0.00 sec)

你可以看到“匿名”,“泰勒”和“维拉特”,“盖尔”有相同的爱好“黑客”和“板球”分别。怎么回事?

8yparm6h

8yparm6h1#

假设您需要id上的主键,但也需要hobby和name的唯一值,您可以对hobby和name列使用唯一约束,例如:

CREATE TABLE `info` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(45) NOT NULL,
  `address` varchar(64) NOT NULL,
  `marks` int(65) unsigned DEFAULT NULL,
  `hobby` varchar(25) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_hobby` (`hobby`), 
  UNIQUE KEY `uk_name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=509 DEFAULT CHARSET=utf8

相关问题