【问题标题】:How to ensure uniqueness of a value in a MySQL DB table in with PHP – a Unique Key use case?如何使用 PHP 确保 MySQL DB 表中值的唯一性——唯一键用例?
【发布时间】:2015-04-21 17:55:56
【问题描述】:

我有一个连接到数据库的网站。在其中一张表中,一个不是主键的实体属性需要在该表中是唯一的。

目前,我在向该列插入值之前查询数据库以检查该值是否已存在。如果是这样,我的脚本会更改该值,然后再次开始相同的过程,直到没有返回结果,这意味着它在数据库中尚不存在。

虽然这可行,但我觉得它的性能消耗很大——即使值是唯一的,数据库也需要至少查询两次:一次用于检查,一次用于写入。

为了提高性能并让我的(可能有错误/不必要的)代码过时,我想将列标记为唯一键并使用 try/catch 块进行写入/错误处理过程。这样,数据库引擎需要处理唯一性,这似乎比我的查询写入过程更合理。

这是一个好主意还是唯一键不是为这种行为而设计的? SQL 数据库中唯一键的典型用例是什么?

【问题讨论】:

  • 是的,这是个好主意。如您所描述的,一个典型的用例。
  • 唯一键是一种将多列组合为一个的方法。如果只有一列,请改用唯一索引。
  • 我没有必要将保留某种类型的结构与两个查询视为浪费。例如,如果第一个查询(或子查询)检索一个 MAX(列),然后您使用它来添加 1。在这种情况下,您将不会有超过 2 个查询。我想这取决于唯一列代表什么:整数、随机字符串或你有什么。

标签: php mysql database unique-key


【解决方案1】:
INSERT INTO table (uniquerow) VALUES(1) ON DUPLICATE KEY UPDATE uniquerow = 1;

使用此语句,如果它是唯一的,您可以插入,如果键已经存在,则更新。

使用唯一约束,您可以多次检查值元组是否存在,而不是主键。

【讨论】:

  • INSERT INTO table (uniquerow) VALUES(1) ON DUPLICATE KEY UPDATE uniquerow = VALUES(uniquerow); --> 这会将值更新为......本身......这是我们能做的最好的事情。您的建议非常接近,但缺少最后一点。 (文档:dev.mysql.com/doc/refman/5.0/en/…
  • 我从来没有听说过这样的事情。我去了谷歌,但谷歌没有找到。仅限ON DUPLICATE KEY UPDATE
  • 另一种可能性是使用 UPDATE IGNORE。这里已经有一个关于哪个更好的问题stackoverflow.com/questions/548541/…@IsmaelMiguel
  • 对于这种情况,我想这是最好的选择。我遇到了那个链接,但我没有给予太多重视。我低估了它。
猜你喜欢
  • 1970-01-01
  • 2016-04-21
  • 1970-01-01
  • 2014-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多