如何在MySQL DML语句中设置特定的UNIQUE列

时间:2013-10-03 15:40:05

标签: php mysql pdo

当我尝试在具有相似列的表中插入记录时,我遇到了问题。所以基本上我的表格结构如下::

+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(11)     | NO   | PRI | NULL    | auto_increment |
| name  | varchar(50) | YES  | MUL | NULL    |                |
+-------+-------------+------+-----+---------+----------------+

现在我的PDO语句是这个::

INSERT INTO supplement_brand (name) VALUES (:name)

基本上我想要的是,每个名称字段都有一个唯一的值。我已在名称字段上设置了INDEX。现在我想从id字段中删除主键和自动增量属性。但这将导致糟糕的数据库设计实践。

现在插入时,id字段会自动自动递增,并且会在名称字段中插入许多重复值:

以下是发生什么事的样本::

+-----+-----------------------------+
| id  | name                        |
+-----+-----------------------------+
|   1 | 2 to 1 Protein Bar          |
|   7 | 2 to 1 Protein Bar          |
|   8 | 2 to 1 Protein Bar          |
|  28 | 2 to 1 Protein Bar          |
|  93 | 2 to 1 Protein Bar          |
|  98 | 2 to 1 Protein Bar          |
| 230 | 2 to 1 Protein Bar          |
| 231 | 2 to 1 Protein Bar          |
| 232 | 2 to 1 Protein Bar          |
|   2 | 360CUT                      |
|   3 | 360CUT                      |
|   4 | 360CUT                      |
|   5 | 360CUT                      |
|   6 | 360CUT                      |
|   9 | 4 Dimension Nutrition       |
|  10 | 4 Dimension Nutrition       |
|  11 | 4 Dimension Nutrition       |
|  12 | 4 Dimension Nutrition       |
|  13 | 4 Dimension Nutrition       |
|  14 | 4 Dimension Nutrition       |
|  15 | 4 Dimension Nutrition       |
|  16 | 4 Dimension Nutrition       |
|  17 | 4 Dimension Nutrition       |
|  18 | 4 Dimension Nutrition       |
|  19 | 4 Dimension Nutrition       |
|  20 | 4 Dimension Nutrition       |
|  21 | 4 Dimension Nutrition       |
|  22 | 4 Dimension Nutrition       |
|  23 | 4 Dimension Nutrition       |
|  24 | 4 Dimension Nutrition       |
|  25 | 4 Dimension Nutrition       |
+-----+-----------------------------+

如何防止在名称字段中插入重复值。请提供任何帮助,我现在真的被困住了。提前致谢

3 个答案:

答案 0 :(得分:1)

INDEX不保证唯一性。为此类任务创建了UNIQUE密钥。

答案 1 :(得分:0)

 ALTER TABLE  `supplement_brand` ADD UNIQUE (`name`);

这应确保名称字段需要唯一值。

如果您添加另一个列,即品牌,并且您希望该名称是唯一的,但只有当他们共享同一品牌时,您才能执行以下操作:

ALTER TABLE  `supplement_brand` ADD UNIQUE (`name` ,`brand`);

答案 2 :(得分:0)

您有两个选项,首先您可以在上面的字段“name”语句中使用UNIQUE或者您可以使用UPSERT语句:请点击此链接获取完整说明:http://mechanics.flite.com/blog/2013/09/30/how-to-do-an-upsert-in-mysql/