唯一地插入到没有唯一键的MySQL表中
我想将数据插入到我的MySQL表中唯一的一个。也就是说,如果表中已经存在完全相同的条目(所有列都包含相同的值),则应该取消插入操作。这很容易通过定义唯一键和处理即将发生的错误来完成,但我无法改变表结构。唯一地插入到没有唯一键的MySQL表中
我敢肯定,即使在没有唯一键的表格中,也可以很容易地捕捉到这一点。当然,我可以事先使用SELECT
声明手动检查这种记录的存在,但可能会有同时修改我的表的同时发生的情况(在检查SELECT
与实际INSERT
之间)。
我想在一个SQL命令中执行检查和INSERT
操作。任何人都可以将我指向正确的方向吗?
让我们假设你有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;
希望这有助于。
您可以对查询使用表锁,直到查询完成处理,其他进程将不会修改它。
检查此链接: http://www.mssqlcity.com/Articles/Adm/SQL70Locks.htm
,然后照你说的使用 “这样的记录SELECT语句提前,但也有可能是修改在此期间我的表(与检查之间并发实例SELECT和实际的INSERT)。“
这篇文章是关于MSSQL的,Q.是针对MySQL –
请注意,你必须严格测试,以确保表格不会永远被锁定,或者你的'SELECT' +'INSERT '不会阻止桌子好几个小时。 –
没有唯一的密钥,以确保唯一行的唯一方法是不允许在桌子上的任何写并发(要么锁定他们或使用serialisable隔离级别)
你在桌子上用钥匙吗?您可以使用'按重复键插入'。 http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html – Tim
@Tim这需要唯一的密钥,@BjörnMarschollek说他不能添加这样的密钥。 –
为什么不能改变桌子,这是做这件事的最好方法。任何其他方式都是黑客行为,如果在锁定完成后发生查询运行期间发生不良情况,并且不释放锁定,则其他任何方法都无法将其插入。 – mikeq