2015-05-27 82 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隱式地創建和插入爲你的價值。

相關問題