我想将数据唯一地插入到我的一个MySQL表中。也就是说,如果表中已经存在完全相同的条目(所有列包含相同的值),则应该取消插入操作。这可以通过定义唯一键并处理即将发生的错误来轻松完成,但我无法更改表结构。
我确信即使在没有唯一键的表中,也有一种简单的方法可以捕获它。当然,我可以提前使用SELECT
语句手动检查是否存在此类记录,但可能会有同时修改我的表的并发实例(在使用SELECT
和实际{的检查之间) {1}})。
我想在一个SQL命令中执行检查和INSERT
操作。有人能指出我正确的方向吗?
答案 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)
没有唯一键,确保唯一行的唯一方法是不允许表上的任何写并发(锁定它们或使用可序列化的隔离级别)