我创建了两个表。它们通过主键和外键连接。当我插入新值时,它表示不能在对象中插入重复键。这是我的表格
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)
以下是错误消息
违反PRIMARY KEY约束&#39; PK__person__228E26BE3A9512B2&#39;。 无法在对象&#39; dbo.person&#39;中插入重复的密钥。重复的密钥 值是(333)。
有人能告诉我的方式吗?非常感谢
答案 0 :(得分:0)
您尚未将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)
答案 1 :(得分:0)
由于sinNum是您的主键,如果您尝试INSERT
包含相同值的新行,它将拒绝您。
在再次添加行之前,只需使用以下查询删除行。
DELETE FROM person WHERE sinNum = 333;
您也可以更新/合并该行,或者根本不添加它,因为您已经完成了它。
答案 2 :(得分:0)
由于'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相同的值。
@@ error在此处用于确保仅在成功插入人员表时插入员工表。
答案 3 :(得分:0)
这里发生的是您在Person表上的插入违反了主键约束。因此,我们可以将此异常用作解毒剂。
您可以使用 Try-Catch 语句,并可以在catch块中实现您的进一步逻辑。
/* You an use @output parameter too */
Declare @output bit=1
BEGIN TRY
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)
print 'Record inserted in both table'
set @output=1
END TRY
BEGIN CATCH
if error_message() like 'Violation of PRIMARY KEY constraint%'
Begin
/* Do whatever you like to do here */
/* You can delete the existing record if you want */
print 'Record already exists is Person table' --just the intimation
set @output=0
End
else
print 'other exception' --just the intimation
END CATCH
您可以删除catch块中的现有记录,也可以使用@output变量创建新事务。。希望它适合你。