违反 PRIMARY KEY 约束“PK_Address”。等等......我做错了啥?
Posted
技术标签:
【中文标题】违反 PRIMARY KEY 约束“PK_Address”。等等......我做错了啥?【英文标题】:Violation of PRIMARY KEY constraint 'PK_Address'. etc...what am I doing wrong?违反 PRIMARY KEY 约束“PK_Address”。等等......我做错了什么? 【发布时间】:2015-05-27 02:12:44 【问题描述】:晚上好。我对SQL
还很陌生,但一直在胡闹。我正在按照我在网上找到的指南在 21 天内学习 SQL
,但我很难弄清楚我收到的错误是什么原因造成的。
我正在尝试将INSERT
数据放入现有表中。此表的主键是AddressID
。我要输入的数据在下面的代码中:
INSERT INTO [dbo].[Address]
(AddressID,Street,City,State,ZipCode)
VALUES
(1,'2400 Broadway','New York','NY',11201),
(2,'320 21st Street','Atlanta','GA',303),
(3,'439 Skyline Blvd','Seattle','WA',98101),
(4,'56 Park Avenue','Dallas','TX',75201);
GO
我不断收到此错误:
消息 2627,级别 14,状态 1,第 2 行违反主键 约束“PK_Address”。无法在对象中插入重复键 'dbo.地址'。重复键值为 (1)。
我已经尝试了我能想到的所有方法,但我无法更新我的表格。我在INSERT INTO
部分下的列名是正确的,我的值也是正确的。我确实发现我可以使用单个 INSERT
语句来获取表中的数据。最初我使用 4 个单独的语句。
我做错了什么?
【问题讨论】:
非常感谢大家的帮助。我能够重新编写旧脚本,并使用数据创建表。一切正常。你们都很棒! 【参考方案1】:在这种情况下,我认为让数据库选择主键而不指定它是安全的。表中可能已经有数据了。
INSERT INTO [dbo].[Address]
(Street,City,State,ZipCode)
VALUES
('2400 Broadway','New York','NY',11201),
('320 21st Street','Atlanta','GA',303),
('439 Skyline Blvd','Seattle','WA',98101),
('56 Park Avenue','Dallas','TX',75201);
GO
【讨论】:
【参考方案2】:从错误消息中可以清楚地看出,表中已经存在AddressID = 1
,因为您在AddressID
上有一个primary key
,您不能插入重复值。
试试这个查询插入到表中
INSERT INTO [dbo].[Address]
(Street,City,State,ZipCode)
SELECT Street,City,State,ZipCode
FROM ( VALUES (1,'2400 Broadway','New York','NY',11201),
(2,'320 21st Street','Atlanta','GA',303),
(3,'439 Skyline Blvd','Seattle','WA',98101),
(4,'56 Park Avenue','Dallas','TX',75201))
v(addressid, street, city, state, zipcode)
WHERE NOT EXISTS (SELECT 1
FROM [dbo].[address] A
WHERE a.addressid = v.addressid)
如果addressid
列具有identity
属性,则从insert
列列表和select
列表中删除addressid
列。
【讨论】:
【参考方案3】:你做错的是:
您的表Address
表中已经有AddressId
(1)。
主键应该是唯一的。您不能在 primary key
列中插入重复值。
你可能会做的是:
update
现有值和 insert
新值。这意味着使用 AddressId
1 更新行并使用新的 AddressId 插入新行。
最好让Sql Server
通过创建“身份列”来决定您的主键值。您可以在创建表时创建标识列,如下所示:
CREATE TABLE [dbo].[Address]
(
[AddressId] [int] IDENTITY(1,1) NOT NULL,
[OtherColumns] [int] NULL,
CONSTRAINT [PK_Address] PRIMARY KEY CLUSTERED (AddressId ASC)
)
请注意,如果您使用Idenity column
创建了一个表,则在insert
操作期间不需要提供任何值,因为 Sql Server 会为您隐式创建和插入该值。
【讨论】:
【参考方案4】:主键必须是唯一的。如果 AddressID 是您的主键,则您的表中不能有两行具有相同的 AddressID 编号。主键通常是自动设置的,因此您不必自己设置。
将主键视为每一行的唯一标识符。重复键错误告诉您地址表中已经有一行 AddressID 值为 1。为避免这些错误,您应该将 AddressID 列设置为 IDENTITY 而不必担心设置值。尝试在不设置 AddressID 的情况下插入记录。像这样:
INSERT INTO [dbo].[Address]
(Street,City,State,ZipCode)
VALUES
('2400 Broadway','New York','NY',11201),
('320 21st Street','Atlanta','GA',303),
('439 Skyline Blvd','Seattle','WA',98101),
('56 Park Avenue','Dallas','TX',75201)
('56 Park Avenue','Dallas','TX',75201);
GO
【讨论】:
以上是关于违反 PRIMARY KEY 约束“PK_Address”。等等......我做错了啥?的主要内容,如果未能解决你的问题,请参考以下文章
交叉应用和外部应用一起使用时违反 PRIMARY KEY 约束
违反 PRIMARY KEY 约束“PK_Address”。等等......我做错了啥?
违反 PRIMARY KEY 约束“PK_EMPLOYEE”。无法在对象中插入重复键