Crear y eliminar tablas

Crear una tabla

Antes de crear una tabla, tienes que elegir la base de datos en la que se guardará. Esto se hace con la sentencia USE:

MySQL 8.4
USE nombre_base_datos;
nombre_base_datos
La base de datos en la que se crearán las tablas.

Para crear una tabla se usa la sentencia CREATE TABLE. Su sintaxis básica es la siguiente:

MySQL 8.4
CREATE TABLE [IF NOT EXISTS] nombre_tabla (
    columna tipo_dato [, ...]
);
  • [ ]parte opcional
  • ...se puede repetir
IF NOT EXISTS

No crea la tabla si ya existe una tabla con ese nombre. Sin esta parte, en ese caso la consulta da error.

Palabra claveOpcional
nombre_tabla
El nombre de la nueva tabla.
columna

El nombre de la columna. Puede haber varios pares columna tipo_dato, separados por comas.

tipo_dato

Qué valores guarda la columna, por ejemplo INTEGER para números o VARCHAR(255) para cadenas.

Por ejemplo, vamos a crear una tabla de usuarios.

MySQL 8.4
CREATE TABLE Users (
    id INTEGER,
    name VARCHAR(255),
    age INTEGER
);
MySQL 8.4
CREATE TABLE Users (
    id INTEGER,
    name VARCHAR(255),
    age INTEGER
);

INTEGER y VARCHAR(255) son tipos de datos: numérico y de cadena, respectivamente. Hablaremos de ellos con más detalle en los próximos artículos.

INTEGER y VARCHAR(255) son tipos de datos: numérico y de cadena, respectivamente. Hablaremos de ellos con más detalle en los próximos artículos.

Parámetros adicionales en la definición de columnas

La definición de columnas que hemos visto arriba es simplificada. Además del nombre de la columna y de su tipo, a veces hay que añadir a la definición los siguientes parámetros opcionales:

  • PRIMARY KEY

    Indica que una columna o un conjunto de columnas es la clave primaria.

  • AUTO_INCREMENT

    Indica que el valor de esta columna se incrementará automáticamente al añadir registros nuevos a la tabla. Cada tabla puede tener como máximo una columna AUTO_INCREMENT. Cabe señalar que este parámetro solo se puede aplicar a tipos enteros y de coma flotante.

  • SERIAL o GENERATED ALWAYS AS IDENTITY

    Indica que el valor de esta columna se incrementará automáticamente al añadir registros nuevos a la tabla. SERIAL es una forma abreviada de crear una columna autoincremental.

  • UNIQUE

    Indica que los valores de esta columna deben ser distintos entre sí en todos los registros.

  • NOT NULL

    Indica que los valores de esta columna deben ser distintos de NULL.

  • DEFAULT

    Indica el valor por defecto.

Para nuestra tabla de usuarios podemos indicar los siguientes parámetros:

MySQL 8.4
CREATE TABLE Users (
    id INTEGER PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(255) NOT NULL,
    age INTEGER NOT NULL DEFAULT 18
);
MySQL 8.4
CREATE TABLE Users (
    id SERIAL PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    age INTEGER NOT NULL DEFAULT 18
);

Así, en este ejemplo:

  • id es una columna numérica que es la clave primaria con autoincremento;
  • id es una columna de tipo SERIAL (entero autoincremental) que es la clave primaria;
  • name es una columna de cadena, obligatoria, con una longitud máxima de 255 caracteres;
  • age es una columna numérica con un valor por defecto de 18.

CURRENT_TIMESTAMP como valor por defecto

CURRENT_TIMESTAMP resulta útil cuando quieres guardar automáticamente la hora en que se creó una fila. Por ejemplo, se puede usar junto con el tipo TIMESTAMP.

MySQL 8.4
CREATE TABLE Users (
    id INTEGER PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(255) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
MySQL 8.4
CREATE TABLE Users (
    id SERIAL PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

Descripción de una tabla

Para ver la descripción de la tabla creada, puedes usar la sentencia DESCRIBE.

MySQL 8.4
DESCRIBE Users;
FieldTypeNullKeyDefaultExtra
idintNOPRINULLauto_increment
namevarchar(255)NONULL
ageintNO18

Para ver la descripción de la tabla creada, puedes consultar el esquema de información:

MySQL 8.4
SELECT column_name, data_type, is_nullable, column_default
FROM information_schema.columns
WHERE table_schema = current_schema() AND table_name = 'users';
column_namedata_typeis_nullablecolumn_default
idintegerNOnextval('users_id_seq'::regclass)
namecharacter varyingNO<NULL>
ageintegerNO18

Parámetros adicionales en la definición de la tabla

Además de la descripción de las columnas, al crear una tabla puedes indicar los siguientes parámetros:

Clave primaria

Si no has definido la clave primaria en los parámetros de la columna, puedes hacerlo con los parámetros adicionales de la tabla, añadiendo PRIMARY KEY (columna [, ...]) después de la lista de columnas:

MySQL 8.4
CREATE TABLE Users (
    id INTEGER,
    name VARCHAR(255) NOT NULL,
    age INTEGER NOT NULL DEFAULT 18,
    PRIMARY KEY (id)
);

Clave primaria

Si no has definido la clave primaria en los parámetros de la columna, puedes hacerlo con los parámetros adicionales de la tabla, añadiendo PRIMARY KEY (columna [, ...]) después de la lista de columnas:

MySQL 8.4
CREATE TABLE Users (
    id INTEGER,
    name VARCHAR(255) NOT NULL,
    age INTEGER NOT NULL DEFAULT 18,
    PRIMARY KEY (id)
);

Claves foráneas

Supongamos que queremos guardar datos sobre la empresa en la que trabajan nuestros usuarios. Vamos a crear una pequeña tabla Companies, en la que guardaremos el identificador único y el nombre de la empresa:

MySQL 8.4
CREATE TABLE Companies (
    id INTEGER,
    name VARCHAR(255) NOT NULL,
    PRIMARY KEY (id)
);

A continuación, hay que añadir a la tabla Users la columna company, el lugar de trabajo de nuestro usuario, que hará referencia a un registro de la tabla Companies. La consulta completa para crear la tabla quedará así:

MySQL 8.4
CREATE TABLE Users (
    id INTEGER,
    name VARCHAR(255) NOT NULL,
    age INTEGER NOT NULL DEFAULT 18,
    company INTEGER,
    PRIMARY KEY (id)
);

Para garantizar, al añadir registros nuevos a la tabla Users, que la columna company contenga un identificador existente en la tabla Companies, se usa una clave foránea. Su sintaxis es la siguiente:

MySQL 8.4
FOREIGN KEY (columna [, ...])
REFERENCES tabla_externa (columna_tabla_externa [, ...])
[ON DELETE accion]
[ON UPDATE accion]
  • [ ]parte opcional
  • ...se puede repetir
columna

La columna de esta tabla que hace referencia a otra tabla. En una clave compuesta, las columnas se enumeran separadas por comas.

tabla_externa

La tabla a cuyos registros hace referencia la clave foránea.

columna_tabla_externa

La columna de la tabla externa con la que se cotejan los valores, normalmente su clave primaria. Debe haber el mismo número de columnas que en FOREIGN KEY, y en el mismo orden.

ON DELETE accion

Qué hacer con los registros de esta tabla cuando se elimina el registro al que hacen referencia.

Opcional
RESTRICTCASCADESET NULLNO ACTION
ON UPDATE accion

Qué hacer con los registros de esta tabla cuando cambia el valor al que hacen referencia.

Opcional
RESTRICTCASCADESET NULLNO ACTION

La consulta completa para crear la tabla con una clave foránea será esta:

MySQL 8.4
CREATE TABLE Users (
    id INTEGER,
    name VARCHAR(255) NOT NULL,
    age INTEGER NOT NULL DEFAULT 18,
    company INTEGER,
    PRIMARY KEY (id),
    FOREIGN KEY (company) REFERENCES Companies (id)
);

Cuando hay claves foráneas, puedes definir cómo se comporta el registro actual cuando se modifica o se elimina el registro al que hace referencia.

MySQL 8.4
CREATE TABLE Users (
    id INTEGER,
    name VARCHAR(255) NOT NULL,
    age INTEGER NOT NULL DEFAULT 18,
    company INTEGER,
    PRIMARY KEY (id),
    FOREIGN KEY (company) REFERENCES Companies (id)
    ON DELETE RESTRICT ON UPDATE CASCADE
);

ON DELETE RESTRICT significa que, si intentas eliminar una empresa que tiene datos en la tabla Users, la base de datos no te dejará hacerlo:

MySQL 8.4
Cannot delete or update a parent row: a foreign key constraint fails

Si se hubiera indicado ON DELETE CASCADE, al eliminar la empresa se eliminarían todos los usuarios que hacen referencia a ella.

Hay otra opción más: ON DELETE SET NULL. Con ella, la base de datos escribirá NULL en la columna company de todos los usuarios que trabajaban en la empresa eliminada.

ON UPDATE CASCADE significa que, si una empresa cambia su identificador, todos los usuarios (Users) recibirán el nuevo identificador en la columna company.

Claves foráneas

Supongamos que queremos guardar datos sobre la empresa en la que trabajan nuestros usuarios. Vamos a crear una pequeña tabla Companies, en la que guardaremos el identificador único y el nombre de la empresa:

MySQL 8.4
CREATE TABLE Companies (
    id INTEGER,
    name VARCHAR(255) NOT NULL,
    PRIMARY KEY (id)
);

A continuación, hay que añadir a la tabla Users la columna company, el lugar de trabajo de nuestro usuario, que hará referencia a un registro de la tabla Companies. La consulta completa para crear la tabla quedará así:

MySQL 8.4
CREATE TABLE Users (
    id INTEGER,
    name VARCHAR(255) NOT NULL,
    age INTEGER NOT NULL DEFAULT 18,
    company INTEGER,
    PRIMARY KEY (id)
);

Para garantizar, al añadir registros nuevos a la tabla Users, que la columna company contenga un identificador existente en la tabla Companies, se usa una clave foránea. Su sintaxis es la siguiente:

MySQL 8.4
FOREIGN KEY (columna [, ...])
REFERENCES tabla_externa (columna_tabla_externa [, ...])
[ON DELETE accion]
[ON UPDATE accion]
  • [ ]parte opcional
  • ...se puede repetir
columna

La columna de esta tabla que hace referencia a otra tabla. En una clave compuesta, las columnas se enumeran separadas por comas.

tabla_externa

La tabla a cuyos registros hace referencia la clave foránea.

columna_tabla_externa

La columna de la tabla externa con la que se cotejan los valores, normalmente su clave primaria. Debe haber el mismo número de columnas que en FOREIGN KEY, y en el mismo orden.

ON DELETE accion

Qué hacer con los registros de esta tabla cuando se elimina el registro al que hacen referencia.

Opcional
RESTRICTCASCADESET NULLSET DEFAULTNO ACTION
ON UPDATE accion

Qué hacer con los registros de esta tabla cuando cambia el valor al que hacen referencia.

Opcional
RESTRICTCASCADESET NULLSET DEFAULTNO ACTION

La consulta completa para crear la tabla con una clave foránea será esta:

MySQL 8.4
CREATE TABLE Users (
    id INTEGER,
    name VARCHAR(255) NOT NULL,
    age INTEGER NOT NULL DEFAULT 18,
    company INTEGER,
    PRIMARY KEY (id),
    FOREIGN KEY (company) REFERENCES Companies (id)
);

Cuando hay claves foráneas, puedes definir cómo se comporta el registro actual cuando se modifica o se elimina el registro al que hace referencia.

MySQL 8.4
CREATE TABLE Users (
    id INTEGER,
    name VARCHAR(255) NOT NULL,
    age INTEGER NOT NULL DEFAULT 18,
    company INTEGER,
    PRIMARY KEY (id),
    FOREIGN KEY (company) REFERENCES Companies (id)
    ON DELETE RESTRICT ON UPDATE CASCADE
);

ON DELETE RESTRICT significa que, si intentas eliminar una empresa que tiene datos en la tabla Users, la base de datos no te dejará hacerlo:

MySQL 8.4
ERROR:  update or delete on table "companies" violates foreign key constraint "users_company_fkey" on table "users"
DETAIL:  Key (id)=(1) is still referenced from table "users".

Si se hubiera indicado ON DELETE CASCADE, al eliminar la empresa se eliminarían todos los usuarios que hacen referencia a ella.

Hay otra opción más: ON DELETE SET NULL. Con ella, la base de datos escribirá NULL en la columna company de todos los usuarios que trabajaban en la empresa eliminada.

ON UPDATE CASCADE significa que, si una empresa cambia su identificador, todos los usuarios (Users) recibirán el nuevo identificador en la columna company.

Eliminar una tabla

Una tabla se elimina con la sentencia DROP TABLE.

MySQL 8.4
DROP TABLE [IF EXISTS] nombre_tabla;
  • [ ]parte opcional
IF EXISTS

No devuelve un error si no existe ninguna tabla con ese nombre.

Palabra claveOpcional
nombre_tabla

La tabla que hay que eliminar junto con todos sus datos.

Tarea interactiva

Ahora que conoces los fundamentos de la creación de tablas, intenta afianzar lo aprendido con esta tarea interactiva:

Ejercicio interactivo no disponible

Para este ejercicio interactivo necesitas una pantalla de al menos 600 píxeles de ancho. Prueba a abrir la página en un ordenador o una tableta.

Arrastra los elementos del panel derecho a los huecos de la consulta SQL para crear correctamente la tabla Users

CREATE TABLE Users (
campo 1
tipo 1
clave
campo 2
tipo 2
restricción 2
campo 3
tipo 3
restricción 3
);
Nombres de los campos:
id
name
age
email
created_at
Tipos de datos:
INTEGER
VARCHAR(255)
INTEGER AUTO_INCREMENT
TEXT
TIMESTAMP
Restricciones:
PRIMARY KEY
NOT NULL
NOT NULL DEFAULT 18
UNIQUE
DEFAULT CURRENT_TIMESTAMP

Requisitos de la tabla:

  • Campo id: número entero autoincremental, clave primaria
  • Campo name: cadena de hasta 255 caracteres, obligatorio
  • Campo age: número entero, obligatorio, valor por defecto 18