有效插入和更新时检查唯一性

时间:2018-08-13 16:26:07

标签: php mysql

工作人员表中有2列,每列的值必须唯一(staff_code,staff_name)

SELECT * 
FROM T 
WHERE DATE = CAST(GETDATE() AS DATE) 
    AND EMPLOYEE_ID NOT IN (SELECT EMPLOYEE_ID 
                            FROM T 
                            WHERE DATE < CAST(GETDATE() AS DATE))

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

在当前过程中,我使用4个功能对其进行检查。

  1. 插入时检查staff_code
  2. 更新时检查人员代码
  3. 插入时检查staff_name
  4. 更新时检查staff_name

我已包含简化代码

检查功能1)

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

检查功能2)

从中获取当前人员类型

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

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

2 个答案:

答案 0 :(得分:2)

提到的唯一索引:

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

总是捕获错误“ ERROR:重复的键值违反唯一约束”,该错误在尝试违反此约束时发生。

答案 1 :(得分:1)

  • 适当添加唯一索引
  • 执行插入/更新
  • 诱捕异常
  • 出现异常时,运行您的函数以找出重复的内容

基本上,让数据库强制唯一性并在引发异常后获取有关异常的详细信息。这样可以最大程度地减少对数据库的调用。即使将所有这些逻辑包装在过程调用中,您仍要先插入/更新并处理异常。这是一种有效的方法,尤其是在大多数情况下插入/更新成功的情况下。