Вопрос:
Вечер все. Я новичок в SQL, но довольно много обманывал. Я следую руководству, которое я нашел в Интернете, чтобы узнать SQL через 21 день, и у меня возникли проблемы с выяснением того, что вызывает ошибка.
Я пытаюсь использовать данные 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
Я продолжаю получать эту ошибку:
Msg 2627, уровень 14, состояние 1, строка 2 Нарушение первичного ключа ограничение “PK_Address”. Невозможно вставить дублирующий ключ в объект ‘Dbo.Address. Значение дублирующегося ключа равно (1).
Я пробовал все, о чем я могу думать, но я не могу обновить таблицу. Мои имена столбцов в разделе INSERT INTO верны, и мои VALUES также верны. Я обнаружил, что могу использовать один оператор 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 Ответ №1
Из сообщения об ошибке очень ясно, что уже AddressID = 1 существует в таблице, так как у вас есть primary key on 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, то удалите столбец AddressID из списка столбцов insert и select.
Ответ №2
Первичные ключи должны быть уникальными. Если 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 Ответ №3
Что вы делаете неправильно:
- У вас уже есть AddressId (1) в таблице Address.
Первичный ключ должен быть уникальным. Вы не можете вставлять повторяющиеся значения в столбец primary key.
Что вы, вероятно, можете сделать, это:
- update существующее значение и insert новые значения. Это значит обновить строку с помощью AddressId 1 и вставить новые строки с новыми AddressIds.
Лучше вы разрешите 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 неявно создает и вставляет эти значения для вас.