如果尚未存在,如何插入到mysql表中?

时间:2014-02-03 14:16:49

标签: mysql insert locking

一个非常简单的问题,但我没有答案。我想在表中插入一条记录,但前提是它还不存在。

这些是我的表格:

  • 表1
    • ID
  • 表2
    • idTable1(FK:table1.id)
    • 场Unik

仅当insert(unik)的值不存在时,我才想插入table2。

我的第一个直觉是锁定更新:

START TRANSACTION;
SELECT * FROM table2 WHERE unik = :unik FOR UPDATE;
IF (NOT EXISTS) 
  INSERT INTO table1 SET ...;
  INSERT INTO table2 SET idTable1 = LAST_INSERT_ID(), ...;
COMMIT;

但是如果该值不存在,它将不会锁定任何内容,如果两个脚本一起运行,它们将插入相同的记录。

我的第二个直觉是在重复键上插入:

INSERT INTO table1 SET ...;
INSERT INTO table2 SET idTable1 = LAST_INSERT_ID(), ... ON DUPLICATE KEY UPDATE idTable1 = idTable1;

但是我已经必须在table2之前插入table1了,那么如果我插入到table1中,如果最终什么都不会插入到table2中呢?

3 个答案:

答案 0 :(得分:1)

为什么不这样做:

START TRANSACTION

... DO SOME STUFF HERE
SAVEPOINT 'before_rollback';
INSERT INTO table1 SET ...;
INSERT INTO table2 SET idTable1 = LAST_INSERT_ID(), ... ON DUPLICATE KEY UPDATE idTable1 = idTable1;

# A record exists, rollback to remove record in table1
if (affected_rows == 1)
{
   rollback 'before_rollback';
}
else
{
   commit;
}

小心:也许MySQL不会“释放”消耗的自动增量(取决于你的MySQL conf:https://dev.mysql.com/doc/refman/5.1/en/innodb-auto-increment-handling.html

答案 1 :(得分:0)

你可以使用计数来查看是否有这样的

select count(*) thecount from table2 where unik = unikvalue

unikvalue是U想要搜索的值(如果存在或不存在) 这里的thecount将有成立的行数

一般语法是

SELECT COUNT(column_name) FROM table_name;

答案 2 :(得分:0)

这个怎么样? (或类似的东西)

INSERT INTO table1 (id) (   
    SELECT * FROM (SELECT NULL) TMP 
    WHERE NOT EXISTS (SELECT 1 FROM table2 WHERE uniq = :uniq)
)