SQL Server, не можете вставить ноль в поле первичного ключа? - PullRequest
17 голосов
/ 07 октября 2010

Я уже готова сорвать с этого волосы.Я довольно новичок в MS SQL, и нигде не видел подобного поста.

Когда я пытаюсь сделать такое заявление:

INSERT INTO qcRawMatTestCharacteristic 
VALUES(NULL, 1,1,1,1,1,1,1,'','','', GETDATE(), 1)

, я получаю следующее:

Невозможно вставить значение NULL в столбец 'iRawMatTestCharacteristicId', таблица 'Intranet.dbo.qcRawMatTestCharacteristic';столбец не допускает пустых значений.INSERT завершается неудачей.

Я понимаю ошибку, но нулевое значение для моего основного поля с типом данных int.

Любые идеи!?

Ответы [ 8 ]

48 голосов
/ 07 октября 2010

Первичные ключи в любой реляционной базе данных не могут иметь значение NULL - это одна из основных, фундаментальных характеристик первичного ключа.

См .: SQL by Design: как выбрать первичный ключ

Никогда Нуль
Никакое значение первичного ключа не может быть нулевым, и вы ничего не можете сделать для сделать первичный ключ пустым. Это неприкосновенное правило реляционного модель, поддерживаемая ANSI , из система управления реляционными базами данных (RDBMS) и SQL Server.

ОБНОВЛЕНИЕ: ОК, так что вам нужен первичный ключ с автоинкрементом в SQL Server.

Вам необходимо определить его как INT IDENTITY в вашем операторе CREATE TABLE:

 CREATE TABLE dbo.YourTable(ID INT IDENTITY, col1 INT, ..., colN INT)

и затем, когда вы делаете INSERT, вам нужно явно указать столбцы для вставки, но просто не указывайте столбец «ID» в этом списке - тогда SQL Server автоматически обработает поиск нужного значения:

 INSERT INTO dbo.YourTable(col1, col2, ..., colN) -- anything **except** `ID`      
 VALUES(va1l, val2, ..., valN)

Если вы хотите сделать это после того, как уже создали таблицу, вы можете сделать это в конструкторе таблиц SQL Server Management Studio:

alt text

8 голосов
/ 07 октября 2010

Поля первичного ключа не могут содержать нулевые значения в MS SQL.Если вы хотите заполнить таблицу SQL и не знаете, что вводить в поле первичного ключа на основе целых чисел, тогда установите pk в поле Identity.Кроме того, при указании операторов вставки целесообразно использовать часть сопоставления столбцов в статистике вставки, например:

Insert into (field1, field2, field3)
values
(value1, value2, value3)

Причина этого заключается в том, что он гарантирует, что порядок столбцов соответствует тому, что вы разработали как администратор SQLизменить порядок столбцов.Это также позволяет вам вставить строку с идентификатором Первичный ключ без указания значения Первичного ключа. Пример

CREATE TABLE [dbo].[foo](
    [fooid] [int] IDENTITY(1,1) NOT NULL,
    [name] [varchar](50) NULL,
 CONSTRAINT [PK_foo] PRIMARY KEY
(
        [fooid] ASC
)

теперь мой оператор вставки прост:

Insert into foo (name)
values
("John")

результат втаблица будет

1, "John"
4 голосов
/ 07 октября 2010

Возможно, у вас нет (вы забыли добавить) автоинкремента для целочисленного первичного ключа.

3 голосов
/ 07 октября 2010

Первичные ключи не должны принимать нулевое значение. Почему вы вставляете нулевые значения в поле первичного ключа? Поле первичного ключа должно иметь уникальное значение, которое не может иметь значения NULL, что сделает каждую вашу запись в таблице уникальной

2 голосов
/ 07 октября 2010

Я предполагаю, что ваша реальная проблема в том, что вы не знаете, как написать оператор вставки, чтобы автоматически заполнить PK?Вам нужно назвать поля, для которых вы устанавливаете значения, похоже, что вы пытаетесь установить все из них, но просто исключите поле PK следующим образом:

INSERT INTO someTable
(fieldName1, fieldName2) 
VALUES(1,1)

Где sometable - это таблица с тремяполя.PK, fieldName1 и fieldName2.Также необходимо убедиться, что для свойства identity в поле PK установлено значение true.

2 голосов
/ 07 октября 2010

Предполагая, что у вас есть поле автоинкремента для вашего первичного ключа, вам нужно будет включить список полей в вашу вставку и не указывать значение для этого поля, например

INSERT INTO qcRawMatTestCharacteristic 
(Answer1,Answer2,...SomeDateField)
VALUES(1,1,1,1,1,1,1,'','','', GETDATE(), 1)
2 голосов
/ 07 октября 2010

вы можете использовать 0 вместо нуля только для 1 уникальной строки, ноль для PK невозможен. Или вы можете опустить PK и использовать и автоматически увеличивать поле PK

0 голосов
/ 07 октября 2010

если у вас есть столбец идентификаторов, вам не нужно указывать его в операторе вставки.

INSERT INTO qcRawMatTestCharacteristic  
VALUES(1,1,1,1,1,1,1,'','','', GETDATE(), 1) 

Однако, если у вас есть первичный ключ, который не является столбцом идентификаторов, вам нужно его указать, так как в противном случае он попытается вставить нулевой ключ, а первичные ключи по умолчанию не обнуляются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...