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

时间:2012-09-22 01:32:40

标签: php mysql database forms pdo

我有一个写入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”字段现在具有“非空”和“唯一索引”属性,如下文档所示: 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'

我遗失的东西?谢谢

1 个答案:

答案 0 :(得分:2)

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

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