Como alterar uma coluna e alterar o valor padrão?

189

Eu recebi o seguinte erro ao tentar alterar o tipo de dados de uma coluna e definir um novo valor padrão:

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

ERRO 1064 (42000): você tem um erro na sua sintaxe SQL; verifique o manual que corresponde à versão do servidor MySQL para a sintaxe correta a ser usada perto de 'VARCHAR (255) NOT NULL SET DEFAULT' {} '' na linha 1

qazwsx
fonte
Eu não acho que você precisa SET antes de padrão
Jonas T

Respostas:

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

Uma segunda possibilidade que faz o mesmo (graças a juergen_d):

ALTER TABLE foobar_data CHANGE COLUMN col col VARCHAR(255) NOT NULL DEFAULT '{}';
fancyPants
fonte
9
O columné opcional. Você pode simplesmente usar ALTER TABLE foobar_data MODIFY col VARCHAR(255) NOT NULL DEFAULT '{}';or ALTER TABLE foobar_data CHANGE col col VARCHAR(255) NOT NULL DEFAULT '{}';e o resultado será o mesmo.
kapad
1
É a string padrão que o OP estava solicitando. Quando você não especifica nenhum valor para esta coluna ao inserir uma linha, o valor se torna {}.
Fancypants
1
Escrever dois cols um ao lado do outro está correto? (como este col col)
Shafizadeh 30/09
4
@Shafizadeh Sim, é. Isso fornece a possibilidade de renomear uma coluna. O primeiro é o nome original, o segundo é o novo nome.
Fancypants
3
Não use isso se precisar alterar apenas o DEFAULTvalor. Isso processará todas as linhas da tabela para nada (muito tempo em tabelas enormes). Em vez disso, use o ALTER TABLE <table_name> ALTER COLUMN <column_name> SET DEFAULT <value>que é instantâneo.
dólmen
114

Como acompanhamento, se você quiser apenas definir um padrão, tenha certeza de que pode usar a sintaxe ALTER .. SET. Só não coloque todas as outras coisas lá. Se você deseja inserir o restante da definição da coluna, use a sintaxe MODIFY ou CHANGE conforme a resposta aceita.

De qualquer forma, a sintaxe ALTER para definir um padrão de coluna (já que era isso que eu estava procurando quando cheguei aqui):

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

Para o qual 'literal' também pode ser um número (por exemplo ...SET DEFAULT 0). Eu não tentei com ...SET DEFAULT CURRENT_TIMESTAMPisso, mas por que não eh?

DaveJenni
fonte
5
O current_timestamp também não estava funcionando para mim se citado. Eu tive que usar o seguinte:ALTER TABLE table_name MODIFY COLUMN column_name TIMESTAMP NOT NULL DEFAULT current_timestamp;
Nereis 15/02
7
+1 Melhor resposta para mim, porque dessa forma eu não preciso especificar o tipo da coluna e outras coisas que não mudarão!
user2342558
2
Esta é a resposta eficiente para alterar apenas o DEFAULTvalor.
dólmen
1
Se você deseja que o valor padrão a ser o momento da inserção, uso NOW()ou current_timestamp()@Malaise @Nereis
BlueCacti
16

Se você deseja adicionar um valor padrão para a coluna já criada, isso funciona para mim:

ALTER TABLE Persons
ALTER credit SET DEFAULT 0.0';
Akash Dole
fonte
2
Essa é a melhor resposta, pois você não precisa copiar a especificação de campo existente.
Rjh 25/09/19
4

Para 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;

Observe a declaração double columnname

Removendo DEFAULT CURRENT_TIMESTAMP:

ALTER TABLE tablename
 ALTER COLUMN columnname1 DROP DEFAULT,
 ALTER COLUMN columnname2 DROPT DEFAULT;
Leonard Lepadatu
fonte
Por que nomes de coluna duplos?
MKJ
2
ALTER TABLE nome da tabela CHANGE COLUMN oldColName newColName columnDefinitions
Leonard Lepadatu
1

Resposta Aceita funciona bem.

No caso de erro de uso inválido do valor NULL , em valores NULL , atualize todos os valores nulos para o valor padrão nessa coluna e tente fazer a alteração.

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

ALTER TABLE foobar_data MODIFY COLUMN col VARCHAR(255) NOT NULL DEFAULT '{}';
Pradeep Kumar Prabaharan
fonte
O que eu precisava. Obrigado
arslion 25/03
0

Caso o procedimento acima não funcione para você (por exemplo: você está trabalhando com o novo SQL ou Azure ), tente o seguinte:

1) elimine a restrição de coluna existente (se houver):

ALTER TABLE [table_name] DROP CONSTRAINT DF_my_constraint

2) crie um novo:

ALTER TABLE [table_name] ADD CONSTRAINT DF_my_constraint  DEFAULT getdate() FOR column_name;
Milão
fonte
0

Tente isto

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

como isso

ALTER TABLE `drivers_meta` CHANGE `driving_license` `driving_license` VARCHAR(30) NULL DEFAULT '';
Sohail Ahmad
fonte