【问题标题】:checking uniqueness when inserting and updating efficiently有效插入和更新时检查唯一性
【发布时间】:2018-08-13 16:26:07
【问题描述】:

我在员工表中有 2 列,每列的值必须是唯一的(staff_code、staff_name)

|  staff_id   | staff_code | staff_name |
|-------------|------------|------------|
| 1           | MGT        | Management |
| 2           | IT         | IT staff   |

在向表中插入或更新项目时,我必须检查 staff_code 和 staff_name 是否唯一。

在当前程序中,我使用 4 个函数来检查它。

  1. 插入时检查staff_code,
  2. 更新时检查staff_code
  3. 插入时检查人员姓名
  4. 更新时检查人员姓名

我已经包含了简化代码

检查功能1)

$SELECT * FROM staff WHERE staff_code = $staff_code
if num_of_rows > 0 //cannot insert, staff_type already exists

检查功能2)

获取当前员工类型
$current_staff_type => SELECT * FROM staff WHERE staff_id = $staff_id

if($current_staff_type == $updated_staff_type){
    //don't update
    return
}

SELECT * FROM staff WHERE staff_type = $updated_staff_type

if(num_of_rows > 0){
    //the type you're going to update already exists
    return
} else{
    //update
}
if num_of_rows > 0 //cannot insert, staff_type already exists

我对其他 2 也有类似的功能。 问题是我必须针对 4 个条件分别发送错误消息。 这是执行此操作的最佳做​​法吗? 除了多次访问数据库,我可以用另一种简单的方法吗?

【问题讨论】:

  • staff_name 真的必须是唯一的吗?会有人在同一个地方工作,同名。
  • SELECT * FROM staff WHERE staff_type = $updated_staff_type OR staff_code = $staff_codeOR检查一次
  • 你也可以在插入 SQL 中有一个子句,只在不存在的情况下执行,然后检查结果是否插入,这会在尝试插入之前保存初始查询
  • 为什么不使用唯一索引?
  • 确实 @Sakezzz 是对的,您当前的方法很容易出现称为 race condition 的情况

标签: php mysql


【解决方案1】:

提到的唯一索引:

ALTER TABLE staff ADD UNIQUE INDEX code_name (staff_code,staff_name)

始终捕获错误“错误:重复键值违反唯一约束”,当试图违反此约束时发生。

【讨论】:

    【解决方案2】:
    • 酌情添加唯一索引
    • 执行插入/更新
    • 陷阱异常
    • 在异常情况下,运行您的函数以找出重复项

    基本上,让数据库强制执行唯一性并在抛出异常后获取有关该异常的详细信息。这将最大限度地减少对数据库的调用。即使您将所有这些逻辑包装在一个过程调用中,您仍然希望先插入/更新,然后处理异常。这是执行此操作的有效方法,尤其是在插入/更新大部分时间都成功的情况下。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多