Изменение столбца: от нуля до нуля


1218

У меня есть таблица, которая имеет несколько обнуляемых целочисленных столбцов. Это нежелательно по нескольким причинам, поэтому я собираюсь обновить все нули до 0, а затем установить для этих столбцов значение NOT NULL. Помимо изменения нулей на 0, данные должны быть сохранены.

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

Использование SQL Server 2000 .


16
Еще одна вещь - вы можете захотеть добавить значение по умолчанию, чтобы любые существующие вставки, в которых не указан столбец, не выходили из строя: ALTER TABLE FOO ADD CONSTRAINT FOO_Bar_Default DEFAULT 0 FOR Bar
Марк Гравелл

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

Ответы:


2014

Сначала уберите все текущие NULLзначения:

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

Затем обновите определение таблицы, чтобы запретить «NULL»:

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

49
Позвольте мне добавить два правильных ответа. Семантика NULL может иметь несколько значений. Одним из распространенных значений является НЕИЗВЕСТНЫЙ. Возьмите SCORE в качестве примера. Нулевая оценка и нулевая оценка - это мир различий! До того, как вы сделали вышеуказанные рекомендации. Убедитесь, что ваше приложение не принимает ноль в своей бизнес-логике.
TechTravelThink

242
Сначала сделайте резервную копию базы данных на случай, если вы сделаете опечатку и ваша БД взорвется
2010 г.

20
Странно, что MS SQL Management Studio не позволяет эту опцию, она хвастается «Удаляя таблицу ...»
Себастьян

14
Базы данных всегда должны быть зарезервированы. Вы никогда не знаете, когда кто-то из ваших людей мог бы написать и оператор UPDATE или DELETE и забыть предложение WHERE.
Река Вивиан

2
@SebastianGodelet: есть настройка, которая позволяет отключить это предупреждение или сделать так, чтобы оно не мешало вам изменять таблицу. В некоторых случаях для изменения схемы таблицы необходимо создать новую таблицу, скопировать данные из старой и удалить старую таблицу. Поскольку ошибка в этом процессе может привести к потере данных, SSMS предупреждает вас и по умолчанию не позволяет вам это сделать.
Сириде

57

У меня была та же проблема, но для поля по умолчанию было установлено значение null, и теперь я хочу установить его по умолчанию равным 0. Это потребовало добавления еще одной строки после решения mdb:

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

Это не решает проблему. Значение по умолчанию уже установлено, это NOT NULL, который необходимо изменить. Только с вашим ответом все существующие записи останутся пустыми, и проблема останется.
PandaWood

6
Вы читали часть про "добавление еще одной строки"? Как, в дополнение к ответу выше?
Грег Догерти

7
На самом деле, нет, не ясно, что «добавление еще одной строки» означает «в дополнение к вышеуказанному ответу» (тем более, что есть много ответов «выше») - если это то, что вы имели в виду, тогда формулировка действительно должна измениться, и вы должны
включите

2
Просто хотел присоединиться и сказать, что это хорошая идея, чтобы явно назвать ваши ограничения, включая значения по умолчанию. Если вам когда-нибудь понадобится удалить столбец, вам нужно знать имя ограничения, которое нужно удалить, прежде чем вы сможете это сделать. Несколько раз сталкивался с этим при переносе БД. Я знаю, что пример включает это здесь, но это все еще место, где некоторые разработчики запутываются, потому что имя не требуется.
17

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;

В противном случае ответ Абатичева казался хорошим. Вы не можете повторить изменение - он жалуется (по крайней мере, в SQL Developer), что столбец уже не нулевой.


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


16

Пока столбец не является уникальным идентификатором

UPDATE table set columnName = 0 where columnName is null

затем

Измените таблицу и задайте для поля значение, не равное NULL, и укажите значение по умолчанию 0


4

это кажется проще, но работает только на Oracle:

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

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


да, но Google направляет людей сюда .. Он получил много положительных отзывов, и много отрицательных. Я думаю, что это полезно. Каждый волен игнорировать это, но я честно думаю и вижу, что это помогает людям.
csomakk

Пожалуйста, прочитайте ТАК правила. Как мне написать хороший ответ? , Отвечая на технические вопросы, ПОЛЕЗНО и напишите идеальный вопрос . Примечания: не бойтесь удалять (или редактировать) бесполезные ответы и не «отвечайте и бегите»
Kiquenet

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, пожалуйста, внесите все изменения. Вы, кажется, не решили все проблемы поста. Большая часть заглавных букв.
двойной гудок

@ двойной гудок, конечно, я учту это. Спасибо
Паван Тивари

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

0

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

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

0

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

  1. Как уже говорили другие, вы не можете установить «not null», пока все существующие данные не «not null», вот так:

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.