2

我收到以下错误:

违反主键约束“PK_ss_student_grade”。无法在对象“dbo.ss_student_grade”中插入重复键。重复键值为 (301, 1011, 24801, 33)。

如果我在插入之前检查表,则没有具有此类主键的记录。

插入是通过 C# 代码完成的,我确保代码只运行一次。即使在错误之后,如果我检查表,我仍然没有得到这样一个主键的记录。

注意:触发器在表中的插入上运行,但它只写入日志文件,不会影响数据库中的任何数据

什么会使 SQL 误以为密钥已经存在?

编辑:代码调用执行以下操作的过程

 insert into ss_student_grade(sg_school_code,sg_acad_year,sg_serial_no,sg_student_key,sg_original_grade,sg_grade,sg_school_grade,sg_category_type,sg_operator,sg_datetime)
 select pg_school_code, pg_acad_year, et_serial_no, mep_student_key, pg_grade,pg_grade,pg_grade,'Original', SYSTEM_USER, @ExamCreationDate
  from #StudentGrades
  where not exists (select 1 from ss_student_grade where sg_school_code = pg_school_code and sg_acad_year = pg_acad_year and sg_serial_no = et_serial_no and sg_student_key = mep_student_key)

我正在使用 SQL Server 2008 R2 和 Visual Studio 2010 Ultimate

4

1 回答 1

3

我会查看临时表#StudentGrades。它很可能包含构成唯一主键的数据的副本。where not exists 不能防止这种情况,因为 SQL 是基于设置的。

您很可能需要更改 PK 的定义、更改#StudentGrades 表的内容或更改选择语句以提供唯一行。

例如,这可以使用 GROUP BY 或 ROW_NUMBER() OVER(PARTITION BY column ORDER BY column)

于 2013-05-13T11:40:51.947 回答