Як змінити стовпчик і змінити значення за замовчуванням?


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 перед ЗАМЕЧЕННЯм
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
Це рядок за замовчуванням, про який запитував ОП. Коли ви не вказуєте значення для цього стовпця під час вставки рядка, значення стає {}.
fancyPants

1
Чи colправильно писати два s один біля одного? (як це 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
НАЗАД ТАБЛИЧНОГО НАЗВАННЯ таблиці ЗМІНИ КОЛІНУ старуКольName newColName стовпецьОзначення
Леонард Лепадату

1

Прийнятий відповідь працює добре.

У разі неприпустимого використання значення NULL помилки, на NULL значень, оновлювати все значення нульові значення , використовувані за замовчуванням в цьому стовпці , а потім спробувати зробити альтер.

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

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

Що мені було потрібно. Спасибі
arslion

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.