Sql server 违反主键约束';主键地址';。等等…我做错了什么?

Sql server 违反主键约束';主键地址';。等等…我做错了什么?,sql-server,primary-key,sql-insert,Sql Server,Primary Key,Sql Insert,晚上好。我对SQL相当陌生,但一直在胡闹。我正在遵循我在网上找到的指南,在21天内学习SQL,我很难弄清楚我收到的错误是什么造成的 我正在尝试将数据插入现有表中。此表的主键是AddressID。我试图输入的数据如下所示: INSERT INTO [dbo].[Address] (AddressID,Street,City,State,ZipCode) VALUES (1,'2400 Broadway','New York','NY',11201), (2

晚上好。我对
SQL
相当陌生,但一直在胡闹。我正在遵循我在网上找到的指南,在21天内学习
SQL
,我很难弄清楚我收到的错误是什么造成的

我正在尝试将数据插入现有表中。此表的主键是
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
我不断地发现这个错误:

Msg 2627,14级,状态1,第2行违反主键 约束“主键地址”。无法在对象中插入重复的键 “dbo.Address”。重复的键值为(1)

我已经尝试了我能想到的一切,但我无法更新我的表。
插入到
部分下的我的列名正确,我的值也正确。我确实发现我可以使用一个
INSERT
语句来获取表中的数据。最初我使用的是4个单独的语句


我做错了什么

在这种情况下,我认为让数据库通过不指定主键来选择主键是安全的。表中可能已经有数据了

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

从错误消息中可以很清楚地看出,表中已经存在
AddressID=1
,因为您在
AddressID
上有一个
主键,因此无法插入重复的值

尝试将此查询插入到表中

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
列列表中删除
addressid
列,并选择
列。

主键必须是唯一的。如果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

你做错的是:

  • 您的表
    地址
    表中已经有
    地址ID
    (1)。 主键应该是唯一的。不能在
    主键
    列中插入重复的值
您可能可以做的是:

  • 更新现有值并插入新值。这意味着使用
    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列的表
,则在
insert
操作期间不需要提供任何值,因为Sql Server会隐式地为您创建和插入这些值。

非常感谢您的帮助。我能够重新编写我的旧脚本,并使用数据创建表。一切都正常运转。你们都太棒了!