所以,我有一个雇员表如下:检查重复根据两列
empid | companyid | empnum | ...
1 | 1 | 1 | ...
2 | 1 | 2 | ...
3 | 1 | 3 | ...
4 | 2 | 1 | ...
5 | 2 | 2 | ...
上表中的每个员工入职获得一个唯一的ID(EMPID)由MSSQL自动生成。我有一个PHP应用程序,它将一个CSV文件作为员工的“主列表”输入。但是,该CSV文件只有来自右侧的“empnum”的列(它不包含companyid或明显的employeeid)。我遍历CSV文件的每一行时都会添加companyid。 CSV 应只包含不在数据库中的员工,但没有保证,所以我需要检查以确保员工在插入前不在那里。验证方法是确保对于这个特定的companyid(假设我们为companyid = 1插入),表中没有匹配的empnum。所以,如果我有这个数据的CSV文件,这将是有效的:
empnum, ...
4, ...
但是,如果我有一个CSV与此数据文件,它不会是有效的:
empnum, ...
3, ...
由于3已经作为companyid = 1的empnum存在,ENTIRE导入应该失败。在PHP应用程序,我有:
try {
db->beginTransaction();
while (($data = fgetcsv($handle, 5000, ",")) !== FALSE) {
//SQL TO INSERT ROW
}
db->commit();
} catch (PDO Exception) {
db->rollBack();
}
我应该使用什么SQL插入行,以便它会导致异常如果empnum已经存在该companyid?我需要做什么数据库更改?我最初的想法是:
选项1 - 插入到一个临时表中,然后运行一个select查询,该查询在companyid/empnum中的匹配值上连接两个表,如果它返回大于0的行,则抛出异常。 PRO:只有一个选择。 CON:所有内容都被插入到临时表中如果它通过select select =很多浪费时间,则转储到临时表中
选项2-根据当前行执行select语句,如果它返回行> 0,抛出异常,否则插入真正的表。 PRO:你一旦遇到失败就会发现失败,这样你就可以节省自己的时间。 CON:你的查询现在增加了(2x-1),所以如果你成功的话,你会有很多额外的开销!
所以我的问题是: - 什么是最好的选择(1,2,或别的东西完全)? - 我可以以某种方式让MSSQL在插入时抛出异常吗?
这不是确切的代码,但你可以得到一个想法: $ nextEmpnum =( “SELECT MAX empnum FROM employee_table WHERE companyid =” $ COMPANY_ID)+1 “INSERT INTO employee_table值(” $ nextEmpnum。 “,”。$ company_id – 2013-03-05 00:00:07
对不起,我应该指定更好的,我没有试图为empnum创建一个唯一的id,empnum将由导入数据的公司提供,我只需要看看员工已经在桌子上存在(基于companyid和empnum的组合) – 2013-03-05 00:43:55
另外,不知道为什么这个问题得到了downvote。如果你downvoted,请说明原因! – 2013-03-05 04:15:09