Змінення стовпця: null не null


1216

У мене є таблиця з кількома нульовими цілими стовпцями. Це небажано з кількох причин, тому я хочу оновити всі нулі до 0, а потім встановити ці стовпці на NOT NULL. Крім зміни нулів на 0дані, дані повинні зберігатися.

Я шукаю специфічний синтаксис SQL, щоб змінити стовпець (викликати його ColumnA) на " not null". Припустимо, дані були оновлені, щоб вони не містили нулів.

Використання SQL-сервера 2000 .


16
Ще одне - ви можете додати за замовчуванням до того, що будь-які наявні вставки, які не визначають стовпець, не пройдуть: ALTER TABLE FOO ADD CONSTRAINT FOO_Bar_Default DEFAULT 0 FOR Bar
Marc Gravell

4
Також ви можете бути здивовані, дізнавшись, що за певних обставин зміна стовпця NOT NULLможе спричинити багато журналу.
Мартін Сміт

Відповіді:


2011

Спочатку змусьте всі поточні NULLзначення зникнути:

UPDATE [Table] SET [Column]=0 WHERE [Column] IS NULL

Потім оновіть визначення таблиці, щоб заборонити "NULLs":

ALTER TABLE [Table] ALTER COLUMN [Column] INTEGER NOT NULL

49
Дозвольте мені додати значення до вищенаведених двох правильних відповідей. Семантика NULL може мати декілька значень. Одне із загальних значень - НЕВІДОМО. Візьміть SCORE як приклад. Нульовий SCORE і ZERO SCORE - це світ різниці! Перед тим, як виконати вищезазначені рекомендації. Переконайтеся, що ваша програма не приймає нульової логіки бізнесу.
TechTravelThink

242
Спершу створіть резервну копію вашої бази даних у випадку, якщо ви введете помилку, і ваш БД вибухне.
mpen

20
Його дивна програма MS SQL Management Studio не дозволяє цю опцію, вона хвалиться "Випадаючим столом ..."
Себастьян

14
Бази даних завжди повинні бути резервними копіями. Ви ніколи не знаєте, коли хтось із ваших людей може написати та ОНОВЛЕННЯ або ВИДАЛИТИ заяву та забути пункт WHERE.
Вівіан-Рівер

2
@SebastianGodelet: є налаштування, яке дозволяє вимкнути це попередження або зробити його таким чином, щоб воно не заважало вам змінювати таблицю. У деяких випадках для зміни схеми таблиці потрібно створити нову таблицю, дані скопійовані зі старої та старої таблиці. Оскільки помилка в цьому процесі може призвести до втрати даних, SSMS попереджає вас і, за замовчуванням, заважає вам це робити.
Сіріде

57

У мене була така ж проблема, але це поле за замовчуванням використовувало нульові показники, і тепер я хочу за замовчуванням до 0. Це вимагало додати ще один рядок після рішення mdb:

ALTER TABLE [Table] ADD CONSTRAINT [Constraint] DEFAULT 0 FOR [Column];

Це не відповідає проблемі. За замовчуванням вже встановлено, що його потрібно змінити НЕ NULL. За умови лише вашої відповіді всі існуючі записи залишаться NULL і проблема залишається.
PandaWood

6
Ви читали частину про "додавання ще одного рядка"? Як в, це додатково до вищезгаданої відповіді?
Грег Даггерті

7
Насправді, ні, не зрозуміло, що "додавання ще одного рядка" означає "на додаток до вищезгаданої відповіді" (тим більше, що відповідей "вище" багато) - якщо саме це ви мали на увазі, то формулювання дійсно потрібно змінити, і вам слід включіть рядок відповіді, на яку ви посилаєтесь
PandaWood

2
Просто хотілося прозвучити і сказати, що це гарна ідея, щоб чітко назвати свої обмеження, включені за замовчуванням. Якщо вам коли-небудь потрібно буде скинути стовпчик, вам доведеться знати назву обмеження, яке потрібно скинути, перш ніж ви зможете. Натрапили на це під час наших міграцій БД кілька разів. Я знаю, що приклад включає його сюди, але це все-таки місце, де девки вирушають, оскільки ім'я не потрібно.
jocull

38

Вам доведеться зробити це в два етапи:

  1. Оновіть таблицю, щоб у стовпці не було нулів.
UPDATE MyTable SET MyNullableColumn = 0
WHERE MyNullableColumn IS NULL
  1. Змініть таблицю, щоб змінити властивість стовпця
ALTER TABLE MyTable
ALTER COLUMN MyNullableColumn MyNullableColumnDatatype NOT NULL

27

Для Oracle 11g я зміг змінити атрибут стовпчика таким чином:

ALTER TABLE tablename MODIFY columnname datatype NOT NULL;

Інакше відповідь абатичева здавалася хорошою. Ви не можете повторити alter - він скаржиться (принаймні на SQL Developer), що стовпець уже не є нульовим.


Схоже, що в Oracle 11 вам не доведеться повторювати datatype. Просто columname NOT NULLдостатньо. Дивіться документацію .
jpmc26


16

Поки стовпець не є унікальним ідентифікатором

UPDATE table set columnName = 0 where columnName is null

Тоді

Змініть таблицю і встановіть поле на ненулеве та вкажіть значення за замовчуванням 0


4

це здається простішим, але працює лише на Oracle:

ALTER TABLE [Table] 
ALTER [Column] NUMBER DEFAULT 0 NOT NULL;

крім того, за допомогою цього ви також можете додавати стовпці, а не просто змінювати їх. У цьому прикладі воно оновлюється до значення за замовчуванням (0), якщо значення було нульовим.


так, але Google спрямовує людей сюди. Це отримало багато відгуків, що викликають це, і багато недоліків. Я думаю, що це корисно. Кожен вільний ігнорувати це, але я чесно думаю і бачу, що це допомагає людям.
csomakk

Прочитайте, будь ласка, правила SO. Як написати гарну відповідь? , ВІДПОВІДАЙТЕ ТЕХНІЧНІ ЗАПИТАННЯ ДОПОМОГНО та напишіть ідеальне запитання . Примітки. Не бійтеся видаляти (або редагувати сильно) непотрібні відповіді і не «відповідь і не бігати»
Кікенет

4

У випадку FOREIGN KEY CONSTRAINT... виникне проблема, якщо "0" немає у стовпці таблиці первинного ключа. Рішення для цього - ...

КРОК 1:

Вимкнути всі обмеження за допомогою цього коду:

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"

КРОК2:

RUN UPDATE COMMAND (as mentioned in above comments)
RUN ALTER COMMAND (as mentioned in above comments)

КРОК3:

Увімкнути всі обмеження за допомогою цього коду:

exec sp_msforeachtable @command1="print '?'", @command2="ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"

4

У моєму випадку у мене виникли труднощі з розміщеними відповідями. Я в кінцевому рахунку використовував наступне:

ALTER TABLE table_name CHANGE COLUMN column_name column_name VARCHAR(200) NOT NULL DEFAULT '';

Перейдіть VARCHAR(200)до типу даних і необов'язково змініть значення за замовчуванням.

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


1

Візьмемо приклад:

TABLE NAME=EMPLOYEE

І я хочу змінити стовпець EMPLOYEE_NAMEна NOT NULL. Цей запит можна використовувати для виконання завдання:

ALTER TABLE EMPLOYEE MODIFY EMPLOYEE.EMPLOYEE_NAME datatype NOT NULL;

Будь ласка, не кричіть і не використовуйте форматування замість цього, щоб зробити вашу публікацію більш зрозумілою. Наприклад, допомогти розпізнати кодову частину. stackoverflow.com/editing-help
Yunnosch

Крім того, не пишіть більше тексту з великої літери. Вважається, що кричать в Інтернеті
Зої,

1
@PawanTiwari будь ласка, внесіть усі зміни. Ви, здається, не вирішили всі проблеми допису. Більша частина його капіталізується.
подвійний звуковий сигнал

@ подвійний звуковий сигнал, звичайно, я пам’ятаю про це. Спасибі
Pawan Tiwari

Окрім питань щодо форматування, будь ласка, зробіть більш очевидним, яке додаткове розуміння дає ваша відповідь, порівняно, наприклад, зі старими відповідями Ральфа Віггума, JDM, Рашмі Сінгха та trooper31, які на перший погляд здаються функціонально однаковими. Здається, для цього необхідно вказати на точніші пункти вашого рішення. Постарайтеся уникати враження просто копіювати відповіді ...
Yunnosch

0

Для вбудованого javaDB, включеного в JDK (підтримуваний Oracle дистрибутив Apache Derby), мені працювало нижче

alter table [table name] alter column [column name] not null;

0

Зробити стовпчик недійсним та додати за замовчуванням також можна виконати в SSMS GUI.

  1. Як уже зазначали інші, ви не можете встановити "не нульове", поки всі існуючі дані не будуть "недійсними" так:

UPDATE myTable SET myColumn = 0

  1. Після цього, переглянувши таблицю в дизайнерському перегляді (клацніть правою кнопкою миші на таблиці та натисніть «Дизайн перегляду»), ви можете зняти прапорці Дозволити стовпчики так:

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

  1. Ще в дизайнерському поданні із вибраним стовпцем, ви можете побачити Властивості стовпця у вікні нижче та встановити за замовчуванням значення 0 у такому ж:

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


Я бачу знімок, але нічого не можу виправити без зворотного зв'язку. Будь ласка, дайте мені знати, якщо щось не вийшло.
Тоні Л.

-1

Ви можете змінити визначення існуючого стовпця БД, використовуючи наступний sql.

ALTER TABLE mytable modify mycolumn datatype NOT NULL;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.