小编典典

SQL主键约束,尽管记录不存在

sql

我收到以下错误:

违反主键约束’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


阅读 188

收藏
2021-04-14

共1个答案

小编典典

我将看一下临时表#StudentGrades。它很可能包含构成唯一主键的数据重复项。不存在的地方并不能防止这种情况,因为SQL是基于设置的。

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

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

2021-04-14