当前位置: 首页 > 知识库问答 >
问题:

如何在服务器SQL外键中插入值?(避免重复键。)

牧梓
2023-03-14

我创建了两个表。它们由主键和外键连接。当我插入新值时,它说不能在对象中插入重复的键。这是我的表

create table person (
sinNum int primary key not null,
gender varchar(6) not null check (gender in ('male','female')) default 'female',
age int not null check (age>=18 and age<=100),
emailAddr varchar (50) not null,
phoneNum int not null,  
)


create table employee (
empId int identity (1,1) unique,
lastName varchar (30) not null,
firstName varchar (30) not null,
sinNum int unique foreign key references person (sinNum),
departmentId int foreign key references department (departmentId), 
position varchar (20) not null check (position in ('clerk','assistant','supervisor','manager','director','president')) default'clerk',
baseSalary float not null
)

这是我的插入声明

insert into person (sinNum,gender,age,emailAddr, phoneNum) values (333, 
'female', 24, 'dds', 2121)

insert into employee(lastName,firstName, sinNum, departmentId, 
position,baseSalary) values ('Snow','John',333,20,'clerk',4000)

以下是错误消息

违反主键约束“PK__person__228E26BE3A9512B2”。无法在对象“dbo”中插入重复密钥。“人”。重复的键值为(333)。

谁能给我指路吗?非常感谢

共有3个答案

宰父学
2023-03-14

因为列'sinum'是主键,所以不能明确定义它。

所以请尝试一下下面的内容。

Insert into person (gender,age,emailAddr, phoneNum) values ( 'female', 24, 'dds', 2121)

Declare @sinnum=IDENT_CURRENT('Person')

If @@error=0

Insert into employee(lastName,firstName, sinnum, departmentId, position,baseSalary) values ('Snow','John',@sinnum,20,'clerk',4000)

Ident_current将最后一次插入的主键值保存在上述表格中。将该值保存在临时变量中,以便在employee表中使用与FK相同的值。

@@此处使用的错误用于确保仅在成功插入到person表时才在employee表上插入。

贾飞鸿
2023-03-14

由于sinNum是主键,如果您尝试INSERT包含相同值的新行,它将拒绝您。

只需使用以下查询删除行,然后再添加。

DELETE FROM person WHERE sinNum = 333;

您还可以更新/合并行或简单地不添加它,因为您已经这样做了。

澹台奇略
2023-03-14

您还没有将sinNum设置为标识。请将其自动递增,然后更改插入查询,如下所示。

insert into person (sinNum,gender,age,emailAddr, phoneNum) values ((SELECT ISNULL(MAX(sinNum)+1,0) FROM person WITH(SERIALIZABLE, UPDLOCK)), 
'female', 24, 'dds', 2121)

您也可以使用更简单的版本,但它不能保证并发

insert into person (sinNum,gender,age,emailAddr, phoneNum) values (NULL, 
'female', 24, 'dds', 2121) 
 类似资料:
  • 我有一个简单的项目,该项目将个人信息提供给数据库(sqlite),现在我想避免插入重复值(按名称),我不能做什么?谢谢你们

  • 我有一个非常简单的表,有3列,我需要一个尽可能轻量级的查询,只有当列有新值时才能插入。 如何编写sql查询来实现这一点?我在网站上已经看到了一些例子,但它们都被我无法理解的更复杂的查询(一些涉及子查询)所混淆。 似乎有不同的方法来做这件事,我需要找到最轻量级的一个,这样我就可以在循环中重复它,一次插入多个标签,而不会给服务器带来太大的压力。

  • 如何避免在PHP MYSQLi中插入重复记录?这是我的剧本:

  • 本文向大家介绍避免在MongoDB中重复输入?,包括了避免在MongoDB中重复输入?的使用技巧和注意事项,需要的朋友参考一下 为了避免在MongoDB中重复输入,可以使用。语法如下- 让我们实现以上语法。避免在MongoDB中重复条目的查询如下- 现在在上面的集合中插入一些记录。插入记录的查询如下- 每当您尝试再次插入相同记录时,都会出现此错误- 让我们插入另一条记录。查询如下- 在method

  • 我只是想插入一些条目到SQL服务器数据库。但是我需要在插入之前检查一下。关键点在于,该表包含两列和。如果条目与SQL服务器数据库中的条目完全相同,则显示的代码应检查这两列,并防止插入该条目。 这意味着数据表的两列与将要插入的两个条目相同。我检查了论坛,但找不到任何有用的解决方案,我的项目。

  • 问题内容: 我试图使用T-SQL的MERGE语句插入许多记录,但是当源表中有重复的记录时,我的查询无法插入。失败原因是: 目标表有一个基于两列的主键 源表可能包含重复记录,这些记录违反了目标表的主键约束(引发了“违反主键约束”) 我正在寻找一种方法来更改我的MERGE语句,以便它要么忽略源表中的重复记录,并且/或者将尝试/捕获INSERT语句以捕获可能发生的异常(即,所有其他INSERT语句都将运