如何根据与现有记录匹配的单个字段值覆盖表中的单个 MySQL 记录?

Posted

技术标签:

【中文标题】如何根据与现有记录匹配的单个字段值覆盖表中的单个 MySQL 记录?【英文标题】:How can I overwrite a single MySQL record in table, based on a single field's value matching that existing record's? 【发布时间】:2012-09-14 10:24:20 【问题描述】:

我有一个写入 mysql 数据库的表单。

例如:

员工编号:

姓名:

年龄:

身高:

重量:

第一个字段,员工编号是一个用户的唯一 ID。

我希望这样的情况是,如果有人使用不同的唯一员工编号填写表格,它会创建一个新记录,但是如果填写的是相同的编号,那么它只会写入旧记录 - 所以他们可以稍后回来调整提交。

我目前编写数据库表单的代码如下所示:

try 
  $pdo = new PDO('mysql:host=localhost; dbname=db1', $username, $password);
  $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

  $stmt = $pdo->prepare('INSERT INTO table
  (
Time,
Unique_ID,
q1,
q2,
q3
) 

VALUES
  (
now(),
:Unique_ID,
:q1,
:q2,
:q3
)');

$stmt->execute(array(
':Unique_ID => $UID,
':q1' => $q1,
':q2' => $q2,
':q3' => $q3
  ));

# Affected Rows?
  echo $stmt->rowCount(); // 1
 catch(PDOException $e) 
  echo 'Error: ' . $e->getMessage();

非常感谢任何和所有帮助,谢谢。

编辑: 根据以下@Adrian Cornish 的建议,我已将查询调整为 REPLACE 语句:

现在是:

try 
  $pdo = new PDO('mysql:host=localhost; dbname=db1', $username, $password);
  $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

  $stmt = $pdo->prepare('REPLACE INTO table
  (
Time,
Unique_ID,
q1,
q2,
q3
) 

VALUES
  (
now(),
:Unique_ID,
:q1,
:q2,
:q3
)');

$stmt->execute(array(
':Unique_ID => $UID,
':q1' => $q1,
':q2' => $q2,
':q3' => $q3
  ));

# Affected Rows?
  echo $stmt->rowCount(); // 1
 catch(PDOException $e) 
  echo 'Error: ' . $e->getMessage();

此外,我已经编辑了 MySQL 数据库中的表结构,使得“Unique_ID”字段现在具有属性“Not Null”和“Unique Index”,如以下文档所示: http://dev.mysql.com/doc/refman/5.6/en/replace.html

状态: REPLACE 的工作方式与 INSERT 完全相同,只是如果表中的旧行与 PRIMARY KEY 或 UNIQUE 索引的新行具有相同的值,则在插入新行之前删除旧行。

但是,在尝试为同一个 Unique_ID 输入两次数据时,我收到了错误:

Error: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '90210'     for key 'Unique_ID_UNIQUE'

我错过了什么?谢谢

【问题讨论】:

你看过REPLACEdev.mysql.com/doc/refman/5.6/en/replace.html 谢谢,这看起来不错,我现在会阅读并尝试使其正常工作 请记住,REPLACE 将删除一行然后插入一个新行,这意味着您的数据库行中任何不在您的表单中的字段都将消失。 @AdrianCornish - 我已经按照上面的编辑指示更新了我的代码,并调整了数据库以包含唯一索引,但是我收到了我所说的错误 - 有什么想法吗?谢谢 【参考方案1】:

您可以在您的员工编号上SELECT,如果返回一行,则发出后续的UPDATE,或者INSERT 查询。这是手动方式。

您可以使用INSERT ... ON DUPLICATE KEY UPDATE 获得相同的结果,但不会那么灵活。

【讨论】:

以上是关于如何根据与现有记录匹配的单个字段值覆盖表中的单个 MySQL 记录?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 MySQL 连接语句选择与链接表中的多个值匹配的记录?

如何覆盖 bigquery 现有表中的列值

查询及删除重复记录

如何查找数据库中的重复数据

用单个列从另一个表更新一个表中的多个列?

如何检索与单个 SQL id 匹配的多个值