如何确保使用PHP的MySQL数据库表中的值的唯一性 - 唯一密钥用例?

问题描述:

我有一个网站连接到数据库。在其中一个表中,不是主键的一个实体属性在该表中必须是唯一的。如何确保使用PHP的MySQL数据库表中的值的唯一性 - 唯一密钥用例?

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

虽然这可行,但我觉得这是一个很棒的性能 - 即使值是唯一的,数据库也需要至少查询两次:一次检查&一次写入。

为了提高性能&让我(可能的越野车/不必要)代码已经过时,我有这个想法,以纪念列作为唯一键&使用try/catch块的写入/错误处理。这样,数据库引擎需要处理唯一性,这似乎比我的查询写入过程更合理。

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

+0

是的,这是一个好主意。一个典型的用例就像你所描述的那样。 –

+0

唯一键是将多列组合成一个整体的方法。如果它只有一列,请改用唯一索引。 – avk

+0

我没有必要把它看作浪费,以保留一些类型的结构与两个查询。例如,如果第一个查询(或子查询)检索MAX(列),然后使用它来添加1.在这种情况下,您将不会有超过2个查询。我想这取决于独特的列表示什么:一个整数,随机字符串,或你有什么。 – Devon

INSERT INTO table (uniquerow) VALUES(1) ON DUPLICATE KEY UPDATE uniquerow = 1; 

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

有了独特的约束条件,您可以检查一个元组的值不会多次出现,而不是主键。

+2

INSERT INTO table(uniquerow)VALUES(1)ON DUPLICATE KEY UPDATE uniquerow = VALUES(uniquerow);' - >这会将值更新为....本身......这是我们能做的最好的。你的建议非常接近,但缺少最后一点。 (Doc:https://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_values) –

+0

我从来没有听说过这样的事情。我继续Google,但谷歌没有找到它。只有“在重复密钥更新”。 –

+0

另一种可能性是使用UPDATE IGNORE。这里有一个关于哪个更好的问题http://*.com/questions/548541/insert-ignore-vs-insert-on-duplicate-key-update @IsmaelMiguel – inetphantom