一个非常简单的问题,但我没有答案。我想在表中插入一条记录,但前提是它还不存在。
这些是我的表格:
仅当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中呢?
答案 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)
)