关于重复键更新 id=last_insert_id(id) - INSERT 真的发生了吗?
on duplicate key update id=last_insert_id(id) - did the INSERT actually happen?
我需要在我的 TABLE 中插入一个新行(具有唯一字段 'A'),如果它已经存在(重复字段,插入失败)- 只需 return ID现有的。
此代码运行良好:
insert into TABLE set A=1 on duplicate key update id=last_insert_id(id)
但现在我遇到了另一个问题:我如何知道 returning ID 属于新的(插入的)行还是旧行?
是的,我可以预先"SELECT id WHERE A=1",但它会使程序代码过于复杂,需要两个步骤,而且看起来很难看。此外,将来我可能想删除一些 UNIQUE 索引,然后我将不得不重写程序以及更改所有 'where' 检查。也许有更好的解决方案?
[已解决,看我的回答]
找到这个解决方案。它在控制台中工作,但在我的程序中不起作用(一定是客户端中的一个错误,idk)——所以它可能对每个人都工作得很好(除了我,叹气)
只需检查 'affected rows count' - 新记录为 1,旧记录为 0
mysql> INSERT INTO EMAIL set addr="test" ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id);
Query OK, 1 row affected (0.01 sec)<----- 1 = INSERTed
mysql> select last_insert_id(); //returns 1
mysql> INSERT INTO EMAIL set addr="test" ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id);
Query OK, 0 rows affected (0.00 sec) <----- 0 = OLD
mysql> select last_insert_id(); //returns 1
UPD:它对我不起作用,因为我的程序在连接到 mysql 时一直发送 'CLIENT_FOUND_ROWS ' 标志。删除了,现在一切正常!
我需要在我的 TABLE 中插入一个新行(具有唯一字段 'A'),如果它已经存在(重复字段,插入失败)- 只需 return ID现有的。
此代码运行良好:
insert into TABLE set A=1 on duplicate key update id=last_insert_id(id)
但现在我遇到了另一个问题:我如何知道 returning ID 属于新的(插入的)行还是旧行?
是的,我可以预先"SELECT id WHERE A=1",但它会使程序代码过于复杂,需要两个步骤,而且看起来很难看。此外,将来我可能想删除一些 UNIQUE 索引,然后我将不得不重写程序以及更改所有 'where' 检查。也许有更好的解决方案?
[已解决,看我的回答]
找到这个解决方案。它在控制台中工作,但在我的程序中不起作用(一定是客户端中的一个错误,idk)——所以它可能对每个人都工作得很好(除了我,叹气)
只需检查 'affected rows count' - 新记录为 1,旧记录为 0
mysql> INSERT INTO EMAIL set addr="test" ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id);
Query OK, 1 row affected (0.01 sec)<----- 1 = INSERTed
mysql> select last_insert_id(); //returns 1
mysql> INSERT INTO EMAIL set addr="test" ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id);
Query OK, 0 rows affected (0.00 sec) <----- 0 = OLD
mysql> select last_insert_id(); //returns 1
UPD:它对我不起作用,因为我的程序在连接到 mysql 时一直发送 'CLIENT_FOUND_ROWS ' 标志。删除了,现在一切正常!