工作人员表中有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_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种情况分别发送错误消息。 这是最佳做法吗? 除了可以多次访问数据库之外,我还能用另一种简单的方法吗?
答案 0 :(得分:2)
提到的唯一索引:
ALTER TABLE staff ADD UNIQUE INDEX code_name (staff_code,staff_name)
总是捕获错误“ ERROR:重复的键值违反唯一约束”,该错误在尝试违反此约束时发生。
答案 1 :(得分:1)
基本上,让数据库强制唯一性并在引发异常后获取有关异常的详细信息。这样可以最大程度地减少对数据库的调用。即使将所有这些逻辑包装在过程调用中,您仍要先插入/更新并处理异常。这是一种有效的方法,尤其是在大多数情况下插入/更新成功的情况下。