¿Cómo alterar una columna y cambiar el valor predeterminado?

190

Recibí el siguiente error al intentar alterar el tipo de datos de una columna y establecer un nuevo valor predeterminado:

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

ERROR 1064 (42000): tiene un error en su sintaxis SQL; consulte el manual que corresponde a la versión de su servidor MySQL para conocer la sintaxis correcta que se debe usar cerca de 'VARCHAR (255) NOT NULL SET DEFAULT' {} '' en la línea 1

qazwsx
fuente
No creo que necesites SET antes de PREDETERMINADO
Jonas T

Respuestas:

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

Una segunda posibilidad que hace lo mismo (gracias a juergen_d):

ALTER TABLE foobar_data CHANGE COLUMN col col VARCHAR(255) NOT NULL DEFAULT '{}';
pantalones de lujo
fuente
9
El columnes opcional. Podrías usar ALTER TABLE foobar_data MODIFY col VARCHAR(255) NOT NULL DEFAULT '{}';o ALTER TABLE foobar_data CHANGE col col VARCHAR(255) NOT NULL DEFAULT '{}';y el resultado será el mismo.
kapad
1
Es la cadena predeterminada que pedía el OP. Cuando no especifica ningún valor para esta columna al insertar una fila, el valor se convierte en {}.
fancyPants
1
¿Es colcorrecto escribir dos s al lado del otro? (como este col col)
Shafizadeh
44
@ Shafizadeh Sí, lo es. Esto proporciona la posibilidad de cambiar el nombre de una columna. El primero es el nombre original, el segundo es el nuevo nombre.
fancyPants
3
No use esto si necesita cambiar solo el DEFAULTvalor. Esto procesará todas las filas de la tabla por nada (muy largo en tablas enormes). Utilice en su lugar ALTER TABLE <table_name> ALTER COLUMN <column_name> SET DEFAULT <value>que es instantáneo.
dolmen
114

Como seguimiento, si solo desea establecer un valor predeterminado, puede estar seguro de que puede usar la sintaxis ALTER .. SET. Simplemente no pongas todas las demás cosas allí. Si va a incluir el resto de la definición de columna, use la sintaxis MODIFICAR o CAMBIAR según la respuesta aceptada.

De todos modos, la sintaxis ALTER para configurar una columna por defecto, (ya que eso era lo que estaba buscando cuando vine aquí):

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

Para el cual 'literal' también podría ser un número (por ejemplo ...SET DEFAULT 0). No lo he probado, ...SET DEFAULT CURRENT_TIMESTAMPpero ¿por qué no eh?

DaveJenni
fuente
55
También current_timestamp no funcionaba para mí si se citaba. Tuve que usar lo siguiente:ALTER TABLE table_name MODIFY COLUMN column_name TIMESTAMP NOT NULL DEFAULT current_timestamp;
Nereis
77
+1 La mejor respuesta para mí, porque de esa manera no necesito especificar el tipo de columna y otras cosas que no cambiarán.
user2342558
2
Esta es la respuesta eficiente para cambiar solo el DEFAULTvalor.
dolmen
1
Si desea que el valor predeterminado sea el momento de la inserción, use NOW()o current_timestamp()@Malaise @Nereis
BlueCacti
16

Si desea agregar el valor predeterminado para la columna ya creada, esto funciona para mí:

ALTER TABLE Persons
ALTER credit SET DEFAULT 0.0';
Akash Dole
fuente
2
Esta es la mejor respuesta, ya que no necesita copiar la especificación de campo existente.
rjh
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;

Tenga en cuenta la declaración de doble nombre de columna

Eliminando DEFAULT CURRENT_TIMESTAMP:

ALTER TABLE tablename
 ALTER COLUMN columnname1 DROP DEFAULT,
 ALTER COLUMN columnname2 DROPT DEFAULT;
Leonard Lepadatu
fuente
¿Por qué nombres de columna doble?
MKJ
2
ALTER TABLE tablename CAMBIAR COLUMNA oldColName newColName columnDefinitions
Leonard Lepadatu
1

La respuesta aceptada funciona bien.

En caso de uso no válido del error de valor NULL , en los valores NULL , actualice todos los valores nulos al valor predeterminado en esa columna y luego intente hacer la modificación.

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

ALTER TABLE foobar_data MODIFY COLUMN col VARCHAR(255) NOT NULL DEFAULT '{}';
Pradeep Kumar Prabaharan
fuente
Lo que necesitaba Gracias
arslion
0

En caso de que lo anterior no funcione para usted (es decir: está trabajando con un nuevo SQL o Azure ) intente lo siguiente:

1) descarte la restricción de columna existente (si existe):

ALTER TABLE [table_name] DROP CONSTRAINT DF_my_constraint

2) crea uno nuevo:

ALTER TABLE [table_name] ADD CONSTRAINT DF_my_constraint  DEFAULT getdate() FOR column_name;
Milán
fuente
0

Prueba esto

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

Me gusta esto

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