Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL:如果不存在则插入,否则重新插入_Mysql_Database - Fatal编程技术网

MySQL:如果不存在则插入,否则重新插入

MySQL:如果不存在则插入,否则重新插入,mysql,database,Mysql,Database,我有一个数据库表,它使用32个字符的字符串作为ID,因此当我向表中添加新数据时,查询将生成字符串ID并将数据插入表中。问题是,查询可能会生成一个重复的ID,因此我所做的是使用IGNORE来避免在ID存在时插入 代码如下: INSERT IGNORE INTO contacts (id_contacts, user_id, contact_id, confirmed ) values ((substring(MD5(UUID()), -32)),1,2,0) 如何重复查询,直到ID不存在并插入

我有一个数据库表,它使用32个字符的字符串作为ID,因此当我向表中添加新数据时,查询将生成字符串ID并将数据插入表中。问题是,查询可能会生成一个重复的ID,因此我所做的是使用IGNORE来避免在ID存在时插入

代码如下:

INSERT IGNORE INTO contacts (id_contacts, user_id, contact_id, confirmed ) 
values ((substring(MD5(UUID()), -32)),1,2,0)

如何重复查询,直到ID不存在并插入数据为止?

这对于注释来说有点长

如果您需要一个不重复的唯一id,那么。我想到了自动增量:

create table contacts (
    contact_id int auto_increment primary key,
    . . .

如果您确实希望列中有一个uuid,那么单独定义它并声明它是唯一的。当然,您必须处理该列上的唯一性冲突。

无需更改您的查询,只需在id\u contacts列上创建一个唯一索引,如

创建唯一索引idx\U id\U联系人
关于联系人id_联系人

以编程方式处理代码/中极为罕见的PK冲突。请记住,当您拥有大数据集时,使用字母数字ID而不是数字ID会带来显著的性能回报。@user2864740您是说不需要预防吗?MD5有什么用途?为什么不使用数字或UUID呢?这个问题的答案决定了最佳解决方案。@I'mnothuman输出域如此之大,以至于冲突的可能性非常小-来自同一生成器的V4随机UUID有效地保证了唯一性;MD5软化了这一点,尽管空间仍然很大,仍然是128位!;MD5结果也是32个字符。。违规绝对是一种例外情况-假设充分的日志记录是一种适当的解决方案,甚至可能是“失败”。处理唯一性违规这一核心“问题”没有区别。重点似乎是我不在乎问题/设计选择是什么,用我的话来说,使用自动递增字段。。然后您[仍然]必须处理该列上的唯一性冲突]而不是我的话。@user2864740。自动增量列不应存在重复问题。问题不在于插入行。问题在于插入具有给定唯一约束/键的行,在这种情况下,假定的冲突最终来自GUID,这也打开了其他讨论。虽然确实存在一个论点,但对于一致性和物理碎片,尤其是与GUID的MD5相比,使用代理自动递增PK,这是一个独立于所问问题的对话。可能需要所述唯一钥匙,答案应确认提议/感知的钥匙需求。