Как изменить столбец и изменить значение по умолчанию?


190

Я получил следующую ошибку при попытке изменить тип данных столбца и установить новое значение по умолчанию:

ALTER TABLE foobar_data ALTER COLUMN col VARCHAR(255) NOT NULL SET DEFAULT '{}';

ОШИБКА 1064 (42000): у вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы узнать правильный синтаксис для использования рядом с 'VARCHAR (255) NOT NULL SET DEFAULT' {} '' в строке 1


Я не думаю, что вам нужно SET до DEFAULT
Jonas T

Ответы:


274
ALTER TABLE foobar_data MODIFY COLUMN col VARCHAR(255) NOT NULL DEFAULT '{}';

Вторая возможность, которая делает то же самое (благодаря juergen_d):

ALTER TABLE foobar_data CHANGE COLUMN col col VARCHAR(255) NOT NULL DEFAULT '{}';

9
Это columnнеобязательно. Вы можете просто использовать ALTER TABLE foobar_data MODIFY col VARCHAR(255) NOT NULL DEFAULT '{}';или, ALTER TABLE foobar_data CHANGE col col VARCHAR(255) NOT NULL DEFAULT '{}';и результат будет таким же.
Капад

1
Это строка по умолчанию, которую запрашивал OP. Когда вы не указываете значение для этого столбца при вставке строки, значение становится {}.
fancyPants

1
Правильно ли писать две colбуквы рядом? (вот так col col)
Шафизаде

4
@ Shafizadeh Да, это так. Это дает возможность переименовать столбец. Первый - оригинальное имя, второй - новое имя.
fancyPants

3
Не используйте это, если вам нужно изменить только DEFAULTзначение. Это обработает все строки таблицы бесплатно (очень долго на огромных таблицах). Используйте вместо этого, ALTER TABLE <table_name> ALTER COLUMN <column_name> SET DEFAULT <value>который является мгновенным.
Дольмен

114

В качестве продолжения, если вы просто хотите установить значение по умолчанию, вы можете использовать синтаксис ALTER .. SET. Только не кладите туда все остальное. Если вы собираетесь вставить оставшееся определение столбца, используйте синтаксис MODIFY или CHANGE в соответствии с принятым ответом.

В любом случае, синтаксис ALTER для установки столбца по умолчанию (поскольку именно это я искал, когда пришел сюда):

ALTER TABLE table_name ALTER COLUMN column_name SET DEFAULT 'literal';

Для которого «литерал» также может быть числом (например ...SET DEFAULT 0). Я не пробовал, ...SET DEFAULT CURRENT_TIMESTAMPно почему бы и нет?


5
Кроме того, current_timestamp не работает для меня, если указан. Я должен был использовать следующее:ALTER TABLE table_name MODIFY COLUMN column_name TIMESTAMP NOT NULL DEFAULT current_timestamp;
Nereis

7
+1 Лучший ответ для меня, потому что таким образом мне не нужно указывать тип столбца и другие вещи, которые не изменятся!
user2342558

2
Это эффективный ответ, чтобы изменить только DEFAULTзначение.
Дольмен

1
Если вы хотите , значение по умолчанию будет время вставки, использования NOW()или current_timestamp()@Malaise @Nereis
BlueCacti

16

Если вы хотите добавить значение по умолчанию для уже созданного столбца, это работает для меня:

ALTER TABLE Persons
ALTER credit SET DEFAULT 0.0';

2
Это лучший ответ, так как вам не нужно копировать существующую спецификацию поля.
rjh

4

Для DEFAULT CURRENT_TIMESTAMP:

ALTER TABLE tablename
 CHANGE COLUMN columnname1 columname1 DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
 CHANGE COLUMN columnname2 columname2 DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;

Обратите внимание на объявление двойного столбца

Удаление DEFAULT CURRENT_TIMESTAMP:

ALTER TABLE tablename
 ALTER COLUMN columnname1 DROP DEFAULT,
 ALTER COLUMN columnname2 DROPT DEFAULT;

Почему двойные имена столбцов?
MKJ

2
ALTER TABLE tablename ИЗМЕНИТЬ КОЛОННУ oldColName newColName column Определения
Леонард Лепадату

1

Принятый ответ работает хорошо.

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

UPDATE foobar_data SET col = '{}' WHERE col IS NULL;

ALTER TABLE foobar_data MODIFY COLUMN col VARCHAR(255) NOT NULL DEFAULT '{}';

Что мне нужно Спасибо
Арслион

0

Если вышеперечисленное не работает для вас (т.е. вы работаете с новым SQL или Azure ), попробуйте следующее:

1) удалить существующее ограничение столбца (если есть):

ALTER TABLE [table_name] DROP CONSTRAINT DF_my_constraint

2) создать новый:

ALTER TABLE [table_name] ADD CONSTRAINT DF_my_constraint  DEFAULT getdate() FOR column_name;

0

Попробуй это

ALTER TABLE `table_name` CHANGE `column_name` `column_name` data_type  NULL DEFAULT '';

как это

ALTER TABLE `drivers_meta` CHANGE `driving_license` `driving_license` VARCHAR(30) NULL DEFAULT '';
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.