Нарушение ограничения PRIMARY KEY для столбца. Я не установил его как

Моя база данных - SQL Server. Я хочу вставить дубликат ключа в RequestId, а потом сталкиваюсь с этой ошибкой.

Кроме того: моя база данных создана Visual Studio Sql Server 2008 Server Project

Я уверен, что в таблице нет ограничений.

Ни один из столбцов не является PRIMARY KEY:

CREATE TABLE [dbo].[RequestPrize] (
    [RequestId] INT           NOT NULL,
    [PrizeId]   INT           NULL,
    [Verified]  BIT           NOT NULL,
    [Created]   SMALLDATETIME NOT NULL
);

Но когда я вставляю дубликат ключа RequestId:

insert into [RequestPrize] (RequestId, PrizeId) values('138', 9)

вывод ошибки:

Нарушение ограничения PRIMARY KEY «PK_RequestPrize». Невозможно вставить повторяющийся ключ в объект 'dbo.RequestPrize'.

Затем я пытаюсь снять это ограничение,

ALTER TABLE [RequestPrize] DROP CONSTRAINT RequestId

ошибка :

Сообщение 3728, уровень 16, состояние 1, строка 1
'RequestId' не является ограничением.
Сообщение 3727, уровень 16, состояние 0, строка 1
Не удалось удалить ограничение. См. предыдущие ошибки.

обновление: я действительно хочу знать, откуда взялось это CONSTRAINT.


person Mithril    schedule 30.12.2013    source источник
comment
Вам нужно убрать ограничение, а не столбец! ALTER TABLE [RequestPrize] DROP CONSTRAINT PK_RequestPrize   -  person marc_s    schedule 30.12.2013
comment
@marc_s О! Вы правы, но я понятия не имею, откуда взялся этот CONSTRAINT . Я создал эту БД Visual Studio Sql Server 2008 Server Project, это он добавил CONSTRAINT?   -  person Mithril    schedule 30.12.2013
comment
И таблица без надлежащего ограничения первичного ключа действительно не очень полезна для начала... поэтому мое предложение будет таким: найдите настоящий первичный ключ для своей таблицы и определяй так! Если у вас нет столбца (столбцов), которые всегда были бы уникальными и ненулевыми, используйте INT IDENTITY в качестве суррогатного первичного ключа.   -  person marc_s    schedule 30.12.2013


Ответы (2)


Без ПК все работает нормально -

CREATE TABLE dbo.RequestPrize
(
    [RequestId] INT           NOT NULL,
    [PrizeId]   INT           NULL,
    [Verified]  BIT           NOT NULL DEFAULT 0,
    [Created]   SMALLDATETIME NOT NULL DEFAULT GETDATE()
)
GO

INSERT INTO dbo.RequestPrize (RequestId, PrizeId) 
VALUES (138, 9)
GO

INSERT INTO dbo.RequestPrize (RequestId, PrizeId) 
VALUES (138, 9)
GO

Так что бросьте (если есть) свой ПК -

IF EXISTS(
    SELECT 1 
    FROM sys.objects o
    WHERE o.type = 'PK'
        AND o.parent_object_id = OBJECT_ID('dbo.RequestPrize', 'U')
) ALTER TABLE dbo.RequestPrize DROP CONSTRAINT PK_RequestPrize
person Devart    schedule 30.12.2013
comment
Да, необработанный sql будет работать идеально, но моя ситуация отличается. Я думаю, это потому, что моя база данных создана Visual Studio Sql Server 2008 Server Project. Решение предоставлено @marc_s в комментариях, но я действительно хочу знать, откуда взялось это ОГРАНИЧЕНИЕ. - person Mithril; 30.12.2013
comment
Последний запрос отбрасывается, если существует PK в таблице dbo.RequestPrize. - person Devart; 30.12.2013
comment
Этот метод действительно хорош, я просто вижу комментарий, чтобы изменить свой пост. Мне жаль, что я не нашел ваших обновлений. Но я действительно хочу знать, откуда взялся этот CONSTRAINT. - person Mithril; 30.12.2013
comment
@ Мифрил, извини, но я не знаю. Возможно, VS автоматически сгенерировал ПК на вашем столе. - person Devart; 30.12.2013

Чтобы удалить ограничение, вы должны использовать псевдоним для ограничения, которое вы указали при создании PK_RequestPrize.

По синтаксису, я думаю, вы используете Microsoft SQLserver, чтобы убедиться, что браузер запросов подключен к правильной БД.

используйте [dbo].[RequestPrize] при вставке, чтобы получить больше подтверждений.

введите здесь описание изображения

person harshal    schedule 30.12.2013