2015-05-27 54 views
3

傍晚。我对SQL相当陌生,但一直在做相当多的鬼话。我正在按照我在网上找到的指南在21天内学习SQL,并且在确定我收到的错误是由什么引起的时遇到了一些问题。违反PRIMARY KEY约束'PK_Address'。等等......我做错了什么?

我想将数据插入到现有的表中。该表的主键是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, Level 14, State 1, Line 2 Violation of PRIMARY KEY constraint 'PK_Address'. Cannot insert duplicate key in object 'dbo.Address'. The duplicate key value is (1).

我已经尝试过所有我能想到的,但我不能让我的表已更新。我在INSERT INTO部分下的列名是正确的,我的VALUES也是正确的。我确实发现我可以使用单个INSERT语句在表中获取我的数据。最初我使用了4个独立的陈述。

我在做什么错?

+0

非常感谢您的帮助。我能够重写我的旧脚本,并使用这些数据创建表。一切工作都应该如此。你们都很棒! – Progunator

回答

3

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

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 
0

从错误信息,因为你有一个AddressIDprimary key无法插入重复的值是很清楚,已经AddressID = 1存在于表中。

尝试此查询插入到表

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列。

0

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

你在做什么错的是:

  • 你已经有AddressId(1)在你的表Address表。主键应该是唯一的。您不能在primary key列中插入重复值。

什么你大概可以做的是:

  • update现有价值和insert新值。这意味着用AddressId 1更新该行并用新的AddressIds插入新行。

最好通过创建`identity column'来让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隐式地创建和插入为你的价值。

相关问题