当前位置: 首页 > 面试题库 >

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

储阳曦
2023-03-14
问题内容

我收到以下错误:

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



 类似资料:
  • 创建的组织: 当我在这个组织中添加新医生时,一切都很好。应用程序正常工作,没有任何错误: 当我添加第二个医生时,我遇到了错误(错误堆栈如下所示): 错误实际上是这样的: 进程:ooper.java:193,PID:5505android.app.RuntimeException:无法启动活动ComponentInfo{hread.main}:hread.java:5292RealmExceptio

  • 尝试在 Postgres 9.5 中更改表以创建外键约束时:从 到 返回错误 我很困惑为什么帖子试图找到,当密钥是从到 有什么想法吗?

  • 我有个任务我必须 创建特定情况的实体关系图,然后 编写SQL代码来表示图表 我不熟悉SQL Server,但我有一个表,它有一个主键和两个外键,与讲师有一个强制关系,与

  • 主要内容:创建约束,删除约束关于 SQL 约束,我们已经在《 RDBMS是什么》中进行了简要介绍,但是现在我们有必要再温习一下,并稍加深入。 约束(Constraint)是指表的数据列必须强行遵守的规则,这些规则用于限制插入表中的数据类型,这样能够确保每份数据的准确定和可靠性。 约束可以是列级别,也可以是表级别;列级约束仅作用于某一列,而表级约束则作用于整张表。 下面是 SQL 常用的一些约束: 约束 说明 NOT NULL

  • SQL 约束(Constraints) SQL 约束用于规定表中的数据规则。 如果存在违反约束的数据行为,行为会被约束终止。 约束可以在创建表时规定(通过 CREATE TABLE 语句),或者在表创建之后规定(通过 ALTER TABLE 语句)。 SQL CREATE TABLE + CONSTRAINT 语法CREATE TABLE table_name ( column_name1 dat

  • 有一个,和表。表具有由和组成的主键约束。我想得到一个学生记录,他们的的分数高于。 从上面的表格中,克莱尔是唯一满足条件的学生,的分数高于。 我不知道如何将查询写入获取此类记录。 我只设法将学生表与计分表进行了内部连接,但不确定从这里开始往哪里走。