2011-06-27 73 views
3

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

我敢肯定,即使在没有唯一键的表格中,也可以很容易地捕捉到这一点。当然,我可以事先使用SELECT声明手动检查这种记录的存在,但可能会有同时修改我的表的同时发生的情况(在检查SELECT与实际INSERT之间)。

我想在一个SQL命令中执行检查和INSERT操作。任何人都可以将我指向正确的方向吗?

+0

你在桌子上用钥匙吗?您可以使用'按重复键插入'。 http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html – Tim

+0

@Tim这需要唯一的密钥,@BjörnMarschollek说他不能添加这样的密钥。 –

+0

为什么不能改变桌子,这是做这件事的最好方法。任何其他方式都是黑客行为,如果在锁定完成后发生查询运行期间发生不良情况,并且不释放锁定,则其他任何方法都无法将其插入。 – mikeq

回答

4

让我们假设你有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; 

希望这有助于。

0

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

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

,然后照你说的使用 “这样的记录SELECT语句提前,但也有可能是修改在此期间我的表(与检查之间并发实例SELECT和实际的INSERT)。“

+2

这篇文章是关于MSSQL的,Q.是针对MySQL –

+0

请注意,你必须严格测试,以确保表格不会永远被锁定,或者你的'SELECT' +'INSERT '不会阻止桌子好几个小时。 –

0

没有唯一的密钥,以确保唯一行的唯一方法是不允许在桌子上的任何写并发(要么锁定他们或使用serialisable隔离级别)