在不使用唯一键的情况下唯一地插入MySQL表

在不使用唯一键的情况下唯一地插入MySQL表,mysql,insert,unique,Mysql,Insert,Unique,我想将数据唯一地插入我的一个MySQL表中。也就是说,如果表中已经存在相同的条目(所有列都包含相同的值),则应该取消insert操作。这可以通过定义唯一键和处理即将发生的错误来轻松完成,但我无法更改表结构 我相信即使在没有唯一键的表中,也有一种简单的方法可以捕捉到这一点。当然,我可以提前使用SELECT语句手动检查此类记录的存在,但同时可能会有修改我的表的并发实例(在使用SELECT进行检查和实际的INSERT之间) 我想在一个SQL命令中执行检查和插入操作。有人能给我指出正确的方向吗?您可以在

我想将数据唯一地插入我的一个MySQL表中。也就是说,如果表中已经存在相同的条目(所有列都包含相同的值),则应该取消insert操作。这可以通过定义唯一键和处理即将发生的错误来轻松完成,但我无法更改表结构

我相信即使在没有唯一键的表中,也有一种简单的方法可以捕捉到这一点。当然,我可以提前使用
SELECT
语句手动检查此类记录的存在,但同时可能会有修改我的表的并发实例(在使用
SELECT
进行检查和实际的
INSERT
之间)


我想在一个SQL命令中执行检查和插入操作。有人能给我指出正确的方向吗?

您可以在查询中使用表锁,在查询完成处理之前,其他进程不会修改它

检查此链接:

然后照你说的做
“这样的记录预先使用SELECT语句,但在此期间(在SELECT检查和实际插入之间)可能会有修改我的表的并发实例。”

没有unique key确保unique行的唯一方法是不允许表上的任何写并发。”(通过锁定它们或使用可序列化隔离级别)

让我们假设您的表中有5列—col1、col2、col3、col4、col5。并且假设您尝试插入的这些列对应的数据在变量中—$col1、$col2、$col3、$col4、$col5(我假设PHP是您的语言,但请根据您的术语修改变量格式)

因此,您的插入可能如下所示:

INSERT INTO `tableA` (`col1`, `col2`, `col3`, `col4`, `col5`)
SELECT $col1, $col2, $col3, $col4, $col5
FROM `tableA`
WHERE NOT EXISTS (SELECT 1
    FROM `tableA`
    WHERE `col1` = $col1
    AND `col2` = $col2
    AND `col3` = $col3
    AND `col4` = $col4
    AND `col5` = $col5);
另一种选择可能是:

INSERT INTO `tableA` (`col1`, `col2`, `col3`, `col4`, `col5`)
SELECT $col1, $col2, $col3, $col4, $col5
FROM `tableA`
WHERE `col1` = $col1
AND `col2` = $col2
AND `col3` = $col3
AND `col4` = $col4
AND `col5` = $col5
HAVING COUNT(1) = 0;

希望这能有所帮助。

您在表中使用密钥吗?您可以使用“在重复密钥上插入”。@Tim这需要唯一的密钥,@Björn Marschollek说他不能添加这样的密钥。为什么您不能更改表,这是最好的方法。任何其他方法都是黑客攻击,如果在锁被锁定后运行查询时发生错误怎么办这篇文章是关于MSSQL的,Q是针对MySQL的。请注意,为了确保表不会永远被锁定,或者确保您的
选择
+
插入
不会在数小时内阻塞表,您必须对测试非常严格。这会吗在具有读提交隔离级别的事务中工作?