插入但忽略如果重复AND如果存在于另一个表中则设置不同的值

时间:2013-12-02 06:09:16

标签: php mysql performance

我正在尝试与Facebook PHP APK一起制作邀请系统。我基本上想要的是当你邀请你的朋友时,Facebook会使用包含用户邀请的朋友的用户ID的数组重定向回你的网站。我想循环遍历它们并将邀请插入数据库。循环和all都已受到控制,但数据库查询不是。

这是我当前的查询:

SELECT `iID` FROM `invitations` WHERE `iSender` = 'SENDER' AND `iReceiver` = 'RECEIVER';

如果返回零行我处理此查询:

INSERT INTO `invitations` (`iSender`, `iReceiver`) VALUES ('SENDER', 'RECEIVER');

然后我检查他们是否已经注册了我的网站:

SELECT `uID` FROM `users` WHERE `uOAuthID` = 'RECEIVER';

如果它返回多于1行,则运行以下和最终查询:

UPDATE `invitations` SET `iProcessed` = 1 WHERE `iReceiver` = 'RECEIVER';

所以基本上这就是当前流程的形成方式:

  1. 如果邀请者尚未邀请用户,我们会将邀请插入数据库。
  2. 然后我们检查受邀用户是否已注册。
  3. 如果他已注册,我们会更新邀请并说明已经处理完毕。
  4. 我想有一个更好更快的方法,只需要1或2个查询即可。我尝试过使用INSERT IGNORE和ON DUPLICATE,但这只是给了我错误而放弃了。

    我希望你明白我在寻找什么。谢谢大家的时间!

1 个答案:

答案 0 :(得分:1)

有满足您需求的东西:

INSERT ... ON DUPLICATE KEY UPDATE语法:

  

如果指定ON DUPLICATE KEY UPDATE,则插入一行   会导致UNIQUE索引或PRIMARY KEY中的重复值   执行旧行的更新。例如,如果列a是   声明为UNIQUE并包含值1,以下两个   陈述具有相同的效果:

     

INSERT INTO表(a,b,c)VALUES(1,2,3)在DUPLICATE KEY UPDATE   C = C + 1;

INSERT IGNORE:

  

如果使用IGNORE关键字,则执行时会出现错误   INSERT语句被忽略。例如,没有IGNORE,就是一行   复制表中的现有UNIQUE索引或PRIMARY KEY值   导致重复键错误,语句被中止。同   IGNORE,行仍未插入,但没有发生错误。