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

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

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

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

14 ответов

Решение

Во-первых, уберите все текущие значения NULL:

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

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

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

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

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

Вам придется сделать это в два этапа:

  1. Обновите таблицу, чтобы в столбце не было нулей.
UPDATE MyTable SET MyNullableColumn = 0
WHERE MyNullableColumn IS NULL
  1. Измените таблицу, чтобы изменить свойство столбца
ALTER TABLE MyTable
ALTER COLUMN MyNullableColumn MyNullableColumnDatatype NOT NULL

Для Oracle 11g мне удалось изменить атрибут столбца следующим образом:

ALTER TABLE tablename MODIFY columnname datatype NOT NULL;

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

Это сработало для меня:

ALTER TABLE [Table] 
Alter COLUMN [Column] VARCHAR(50) not null;

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

UPDATE table set columnName = 0 where columnName is null

затем

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

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

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

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

В случае 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"

В моем случае у меня были трудности с опубликованными ответами. Я закончил тем, что использовал следующее:

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

+ Изменить VARCHAR(200) к вашему типу данных и при необходимости измените значение по умолчанию.

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

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

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

UPDATE myTable SET myColumn = 0

  1. Как только это будет сделано, с таблицей в режиме конструктора (щелкните правой кнопкой мыши по таблице и выберите "представление конструктора"), вы можете просто снять флажки "Разрешить пустые значения" следующим образом:

  1. По-прежнему в режиме конструктора с выбранным столбцом вы можете увидетьсвойства столбца в окне ниже и установить значение по умолчанию 0, например, так:

Давайте возьмем пример:

TABLE NAME=EMPLOYEE

И я хочу изменить столбец EMPLOYEE_NAME в NOT NULL, Этот запрос можно использовать для задачи:

ALTER TABLE EMPLOYEE MODIFY EMPLOYEE.EMPLOYEE_NAME datatype NOT NULL;

Вы можете изменить определение существующего столбца БД, используя следующий sql.

ALTER TABLE mytable modify mycolumn datatype NOT NULL;

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

alter table [table name] alter column [column name] not null;
  1. Сначала убедитесь, что столбец, который вы изменяете, не имеет нулевых значений, выберите count(*) из таблицы, где имя столбца равно null

  2. Вписать недостающие значения. вы можете заменить нули пустой строкой, нулем, средним или медианным значением или интерполированным значением. Это зависит от вашей стратегии обратного заполнения или стратегии прямого заполнения.

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

Другие вопросы по тегам