【问题标题】:Insert if not exist otherwise update on two tables in the same query如果不存在则插入,否则更新同一查询中的两个表
【发布时间】:2013-04-26 15:26:07
【问题描述】:

所以我一直在阅读 mysql 不支持插入到乘法表中。 您实际上需要在查询中执行两个或多个 INSERT INTO 。但我的问题是更新两个表,但如果一个表不存在则插入。是否可以仅在一个查询中完成?

我有这个。

UPDATE user, userdetails SET
userdetails.firstname   = ?,
user.username       = ?,
user.email              = ?,
userdetails.location    = ?
WHERE user.id               = ? 
AND userdetails.user_id     = ?

$values = array($firstname,$username,$email,$location,$_SESSION['id'],$_SESSION['id']);

但它并不总是放在最后一行

 AND userdetails.user_id='{$_SESSION['id']}'

我也读过 DUPLICATE KEY UPDATE,但这不应该工作,因为它们不止一张桌子?

我可以轻松地创建一个查询,在用户注册时默认将 user_id 插入到 userdetails.user_id 中,但如果有这个查询会更好。

【问题讨论】:

  • 如果您可以使用占位符,请将其用于任何所有用户数据,包括$_SESSION中的任何内容。为什么您将自己暴露在可能的 SQL 注入错误中,这令人费解。
  • @tadman 你的权利。更新了。
  • 您要执行的操作是MERGE 语句。不幸的是,AFAIK,MySQL 不支持它。
  • 对于“如果不存在则插入”,您可以使用REPLACE

标签: mysql


【解决方案1】:

INSERT 语句不支持同时向多个表添加记录。为此,您需要一个简单的交易:

BEGIN
INSERT INTO table_a (...)
INSERT INTO table_b (...)
COMMIT

如果插入table_a 时出现错误,则可以回滚到事务的开头。这是 SQL 标准的做事方式。

如果记录已经存在,您可以使用INSERT ... ON DUPLICATE KEY 更新就地记录,或者使用非标准 MySQL REPLACE INTO 删除任何冲突记录并用您的数据替换它们。

【讨论】:

  • 谢谢!那是我一直在寻找的。休息一下,一个小时后试试。再次感谢您
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-06
  • 1970-01-01
相关资源
最近更新 更多