在没有唯一键的情况下唯一地插入MySQL表

时间:2011-06-27 14:48:22

标签: mysql insert unique

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

我确信即使在没有唯一键的表中,也有一种简单的方法可以捕获它。当然,我可以提前使用SELECT语句手动检查是否存在此类记录,但可能会有同时修改我的表的并发实例(在使用SELECT和实际{的检查之间) {1}})。

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

3 个答案:

答案 0 :(得分:5)

我们假设您的表中有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;

希望这有帮助。

答案 1 :(得分:0)

您可以对查询使用表锁,直到查询完成处理,其他任何进程都不会对其进行修改。

检查此链接: http://www.mssqlcity.com/Articles/Adm/SQL70Locks.htm

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

答案 2 :(得分:0)

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