Listado completo de tutoriales

22 - Atributo default en una columna de una tabla.


Ver video

Si al insertar registros no se especifica un valor para un campo, se inserta su valor por defecto implícito según el tipo de dato del campo. Por ejemplo:

 insert into libros (titulo,autor,editorial,precio,cantidad)
  values('Java en 10 minutos','Juan Pereyra','Paidos',25.7,100);

Como no ingresamos valor para el campo "codigo", MySQL insertará el valor por defecto, como "codigo" es un campo "auto_increment", el valor por defecto es el siguiente de la secuencia.

Si omitimos el valor correspondiente al autor:

 insert into libros (titulo,editorial,precio,cantidad)
  values('Java en 10 minutos','Paidos',25.7,200);

MySQL insertará "null", porque el valor por defecto de un campo (de cualquier tipo) que acepta valores nulos, es "null".

Lo mismo sucede si no ingresamos el valor del precio:

 insert into libros (titulo,autor,editorial,cantidad)
  values('Java en 10 minutos','Juan Pereyra',Paidos',150);

MySQL insertará el valor "null" porque el valor por defecto de un campo (de cualquier tipo) que acepta valores nulos, es "null".

Si omitimos el valor correspondiente al título:

 insert into libros (autor,editorial,precio,cantidad)
  values ('Borges','Paidos',25.7,200);

MySQL guardará una cadena vacía, ya que éste es el valor por defecto de un campo de tipo cadena definido como "not null" (no acepta valores nulos) (en la última versión de MySQL 8.0 no se permite no indicar valores para un campo de tipo not null)

Si omitimos el valor correspondiente a la cantidad:

 insert into libros (titulo,autor,editorial,precio)
  values('Alicia a traves del espejo','Lewis Carroll','Emece',34.5);

el valor que se almacenará será 0, porque el campo "precio" es de tipo numérico "not null" y el valor por defecto de los tipos numéricos que no aceptan valores nulos es 0 (en la última versión de MySQL 8.0 no se permite no indicar valores para un campo de tipo not null)

Podemos establecer valores por defecto para los campos cuando creamos la tabla, esta es una muy buena decisión para evitar incompatibilidades entre distintas versiones de MySQL. Para ello utilizamos "default" al definir el campo. Por ejemplo, queremos que el valor por defecto del campo "precio" sea 1.11 y el valor por defecto del campo "autor" sea "Desconocido":

 create table libros(
  codigo int unsigned auto_increment,
  titulo varchar(40) not null,
  autor varchar(30) default 'Desconocido', 
  precio decimal(5,2) unsigned default 1.11,
  cantidad int unsigned not null,
  primary key (codigo)
 );

Si al ingresar un nuevo registro omitimos los valores para el campo "autor" y "precio", MySQL insertará los valores por defecto definidos con la palabra clave "default":

 insert into libros (titulo,editorial,cantidad)
  values('Java en 10 minutos','Paidos',200);

MySQL insertará el registro con el siguiente valor de la secuencia en "codigo", con el título, editorial y cantidad ingresados, en "autor" colocará "Desconocido" y en precio "1.11".

Entonces, si al definir el campo explicitamos un valor mediante la cláusula "default", ése será el valor por defecto; sino insertará el valor por defecto implícito según el tipo de dato del campo.

Los campos definidos "auto_increment" no pueden explicitar un valor con "default", tampoco los de tipo "blob" y "text".

Los valores por defecto implícitos son los siguientes:

-para campos de cualquier tipo que admiten valores nulos, el valor por defecto "null";

-para campos que no admiten valores nulos, es decir, definidos "not null", el valor por defecto depende del tipo de dato y las versiones nuevas de MySQL 8.0 generan un error:

-para campos numéricos no declarados "auto_increment": 0;

-para campos numéricos definidos "auto_increment": el valor siguiente de la secuencia, comenzando en 1;

-para los tipos cadena: cadena vacía.

Ahora al visualizar la estructura de la tabla con "describe" podemos entender un poco más lo que informa cada columna:

describe libros;

"Field" contiene el nombre del campo; "Type", el tipo de dato; "NULL" indica si el campo admite valores nulos; "Key" indica si el campo está indexado (lo veremos más adelante); "Default" muestra el valor por defecto del campo y "Extra" muestra información adicional respecto al campo, por ejemplo, aquí indica que "codigo" está definido "auto_increment".

También se puede utilizar "default" para dar el valor por defecto a los campos en sentencias "insert", por ejemplo:

 insert into libros (titulo,autor,precio,cantidad)
  values ('El gato con botas',default,default,100);

Servidor de MySQL instalado en forma local.

Ingresemos al programa "Workbench" y ejecutemos el siguiente bloque de instrucciones SQL:

drop table if exists libros;

create table libros(
  codigo int unsigned auto_increment,
  titulo varchar(40) not null,
  editorial varchar(15),
  autor varchar(30) default 'Desconocido',
  precio decimal(5,2) unsigned default 1.11,
  cantidad mediumint unsigned not null,
  primary key (codigo)
 );

insert into libros (titulo,autor,editorial,precio,cantidad)
  values('Java en 10 minutos','Juan Pereyra','Paidos',25.7,100);

-- error debido a que el campo titulo es de tipo not null
insert into libros (autor,editorial,precio,cantidad)
  values('Juan Perez','Planeta',28.50,50);

-- se guarda null en el campo editorial
insert into libros (titulo,autor,precio,cantidad)
  values('Aprenda PHP','Alberto Lopez',55.40,150);

-- se guarda el valor por defecto 'Desconocido' en el campo autor
insert into libros (titulo,editorial,precio,cantidad)
  values ('El gato con botas','Emece',15.6,150);

-- se guarda en precio el valor definido en default
insert into libros (titulo,autor,editorial,cantidad)
  values ('El aleph','Borges','Emece',200);

-- error debido a que no indicamos el campo cantidad que es not null
insert into libros (titulo,autor,editorial,precio)
  values('Alicia a traves del espejo','Lewis Carroll', 'Emece',34.5);

-- Se guarda en precio 1.11 porque indicamos almacenar default
insert into libros (titulo,autor,editorial,precio,cantidad)
  values ('El gato con botas',default,'Planeta',default,100);

select * from libros;

Que nos generan una salida similar a esta:

MySQL

Retornar