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

Posted

技术标签:

【中文标题】尽管记录不存在,但 SQL 主键约束【英文标题】:SQL primary key constraint although record does not exist 【发布时间】:2013-05-13 11:24:04 【问题描述】:

我收到以下错误:

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

【问题讨论】:

代码调用一个过程,该过程执行以下插入 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) 选择 pg_school_code, pg_acad_student_year, etkey, pg_grade,pg_grade,pg_grade,'Original', SYSTEM_USER, @ExamCreationDate from #StudentGrades where 不存在(从 ss_student_grade 中选择 1,其中 sg_school_code = pg_school_code 和 sg_acad_year = pg_acad_year 和 sg_serial_no = et_serial_no 和 sg_student_key = mep_student_key) 我猜select 会返回重复项 【参考方案1】:

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

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

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

【讨论】:

它起作用了:我只是禁用了触发器然后再次启用它似乎有一些错误的数据或什么的。谢谢

以上是关于尽管记录不存在,但 SQL 主键约束的主要内容,如果未能解决你的问题,请参考以下文章

更新时SQL违反主键约束

SQL的约束

SQL Sever表添加主键失败

SQL有三个类型的索引,唯一索引 不能有重复,但聚集索引,非聚集索引可以有重复

主键和外键的作用

mysql 5.7 使用主键约束