Чому SQL-сервер видає цю помилку: Не вдається вставити значення NULL у стовпець 'id'?


80

Я використовую такий запит:

INSERT INTO role (name, created) VALUES ('Content Coordinator', GETDATE()), ('Content Viewer', GETDATE())

Однак я не вказую первинний ключ (який є id). Тож мої запитання: чому сервер sql повертається з цією помилкою:

Msg 515, Level 16, State 2, Line 1
Cannot insert the value NULL into column 'id', table 'CMT_DEV.dbo.role'; column does not allow nulls. INSERT fails.
The statement has been terminated.

Відповіді:


148

Я припускаю, що idце повинно бути зростаючим значенням.

Вам потрібно встановити це, інакше якщо у вас є ненульований стовпець, без значення за замовчуванням, якщо ви не вказали значення, це призведе до помилки.

Щоб налаштувати автоматичне збільшення в SQL Server Management Studio:

  • Відкрийте свій стіл у Design
  • Виберіть стовпець і перейдіть до Column Properties
  • Під Indentity Specification, встановити (Is Identity)=YesіIndentity Increment=1

але у мене є 2 стовпці з ідентифікатором id_student .. Я така ж помилка .. я можу встановити ідентичність лише один стовпець .. якщо я встановив для id засоби, помилка для id_student або якщо я встановив для id_student означає, що отримав помилку для id.
шт.

При спробі зберегти ці зміни, Management Studio каже: "Зберігати зміни не дозволяється. Внесені вами зміни вимагають видалення та повторного створення наступних таблиць. Ви або внесли зміни до таблиці, які неможливо створити заново. або ввімкнув опцію Запобігти збереженню змін, що вимагають повторного створення таблиці. "
Хенно,

9
Хоча я не вмикав цю опцію, вона виявилася УВІМКНЕНОЮ. Я зняв його (під Інструменти> Параметри> Дизайнери) і зміг зберегти зміни.
Хенно,

7

використовувати IDENTITY(1,1)під час створення таблиці, наприклад

CREATE TABLE SAMPLE(
[Id]     [int]  IDENTITY(1,1) NOT NULL,
[Status] [smallint] NOT NULL,

CONSTRAINT [PK_SAMPLE] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)
)

4

Якщо idстовпець не має значення за замовчуванням, але має NOT NULLобмеження, тоді ви повинні вказати значення самостійно

INSERT INTO dbo.role (id, name, created) VALUES ('something', 'Content Coordinator', GETDATE()), ('Content Viewer', GETDATE())

1

якщо ви не можете або не хочете встановити властивість автоінкременту ідентифікатора, ви можете встановити значення ідентифікатора для кожного рядка, наприклад:

INSERT INTO role (id, name, created)
SELECT 
      (select max(id) from role) + ROW_NUMBER() OVER (ORDER BY name)
    , name
    , created
FROM (
    VALUES 
      ('Content Coordinator', GETDATE())
    , ('Content Viewer', GETDATE())
) AS x(name, created)

0

Вам потрібно вказати ідентифікатор у вставці, або потрібно налаштувати стовпець ідентифікатора в базі даних, щоб мати Ідентифікаційну специфікацію = Так.


0

Оскільки ідентифікатор PK він ПОВИНЕН бути унікальним та не нульовим. Якщо ви не згадаєте жодне поле у ​​списку полів для вставки, це буде вважатися нулем або значенням за замовчуванням. Встановіть ідентичність (тобто автоінкремент) для цього поля, якщо ви не хочете щоразу встановлювати його вручну.


0

Вам потрібно встановити для властивості autoincrement стовпця id значення true, коли ви створюєте таблицю, або ви можете змінити свою існуючу таблицю, щоб зробити це.


0

ви не вказали значення для ідентифікатора. Спробуйте це :

INSERT INTO role (id, name, created) VALUES ('example1','Content Coordinator', GETDATE()), ('example2', 'Content Viewer', GETDATE())

Або ви можете встановити автоматичне збільшення в полі id, якщо вам потрібно автоматично додати значення id.


0

У мене була подібна проблема, і при її розгляді просто не було поля у фактичній таблиці id( idбуло empty/null) - тобто, коли ви намагаєтесь зробити idполе таким, primary keyце призведе до помилки, оскільки таблиця містить рядок зі nullзначенням для primary key.

Це може бути виправленням, якщо ви бачите тимчасову таблицю, пов’язану з помилкою. Я використовував SQL Server Management Studio.


-1

@curt правильний, але я помітив, що іноді навіть це не вдається із забороненими NULL помилками, і це, здається, періодично. Я завжди уникав помилки, також встановивши значення Indenty Seed на 1 і IDENTITY(1, 1) NOT FOR REPLICATION.


-1

У моєму випадку

Я намагався оновити свою модель, зробивши необхідним зовнішній ключ, але в базі даних були "нульові" дані вже в деяких стовпцях із раніше введених даних. Отже, кожного разу, коли я запускаю update-database ..., я отримую помилку.

Я ВИРІШИВ це, вручну видаливши з бази даних усі рядки, які мали нульове значення у стовпці, який я робив необхідним.


-1

якщо використовувати entityframework. відкрити міграцію, встановити значення nullable: true та оновити базу даних

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


1
Будь ласка , не залишайте зображення коду, скопіюйте код в питання з форматом блок коду: stackoverflow.com/help/how-to-ask
borchvm

1
Ласкаво просимо до Stack Overflow! Зверніть увагу, що ви відповідаєте на дуже давнє, на яке вже відповідали. Ось посібник із відповіді .
help-info.de

-4

Ви можете вставити значення вручну в стовпець ID (тут я називаю це "PK"):

insert into table1 (PK, var1, var2)
values ((select max(PK)+1 from table1), 123, 456)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.