我收到以下错误:
违反主键约束’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
我将看一下临时表#StudentGrades。它很可能包含构成唯一主键的数据重复项。不存在的地方并不能防止这种情况,因为SQL是基于设置的。
您很可能需要更改PK的定义,更改#StudentGrades表的内容或更改select语句以提供唯一的行。
例如,可以使用GROUP BY或ROW_NUMBER()OVER(PARTITION BY列ORDER BY列)