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

标签 php mysql database forms pdo

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

例如:

员 worker 数:

姓名:

年龄:

高度:

重量:

第一个字段,员工编号是一个用户的唯一 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'

我缺少什么吗?谢谢

最佳答案

您可以对员工编号进行 SELECT,如果返回一行,则发出后续 UPDATE,否则发出 INSERT 查询。这就是手动方式。

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

关于php - 如何根据与现有记录匹配的单个字段值覆盖表中的单个 MySQL 记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12539971/

相关文章:

php - 特殊数据库创建-MySQL

c# - 可部署数据库测试方法

javascript - php 类/函数没有得到正确的 id

php - 使用 PHP 中的复选框更新表中的值

php - Codeigniter 从结果行中获取 2 列()

来自 Mysql 的 Php 分页 Select * Where;如果单击下一个页码,则显示来自 Mysql 的所有行

java - Android SQLite : Running the Same Query with Different Parameters Multiple Times Efficiently

database - 关于维数灾难

php - mysql | mysql | PHP |在自己的表中加入

javascript - jQuery $.get 有时有效,有时无效?