🙏 Realmente necesitamos su apoyo. Necesitamos financiamiento para continuar nuestra misión: publicar nuevas lecciones y mejorar la plataforma. Si puede, por favor apoye el proyecto con una donación. Ayude al proyecto ahora →
Código SQL copiado al portapapeles

Lección 9.1: La sentencia CREATE TABLE

Hasta ahora, hemos trabajado principalmente con tablas existentes y hemos recuperado datos de ellas. Pero en el trabajo real con bases de datos, es importante no solo leer datos, sino también saber cómo crear la estructura utilizada para almacenarlos. Ahí es donde entra la sentencia CREATE TABLE.

CREATE TABLE pertenece al Lenguaje de Definición de Datos (DDL). Se utiliza para describir cómo debe estar estructurada una tabla: qué columnas contendrá, qué tipos de datos usarán esas columnas y qué reglas se aplicarán a los valores almacenados en ellas.

La Sintaxis Básica

La forma más simple de la sentencia se ve así:

CREATE TABLE table_name (
    column1 data_type,
    column2 data_type,
    column3 data_type
);

Después del nombre de la tabla, las columnas se enumeran dentro de paréntesis. Para cada columna, necesitas especificar:

  • el nombre de la columna (requerido);
  • el tipo de dato (requerido);
  • y, cuando sea necesario, características adicionales como codificación, restricciones, comentarios y otros.

Ejemplo de una Tabla Simple

Vamos a crear una tabla students:

CREATE TABLE students (
    student_id INT,
    first_name VARCHAR(50),
    last_name VARCHAR(50),
    birth_date DATE,
    created_at TIMESTAMP
);

En este ejemplo:

  • student_id es un entero;
  • first_name y last_name son valores de texto de hasta 50 caracteres;
  • birth_date almacena la fecha de nacimiento;
  • created_at almacena la fecha y hora en que se creó el registro.

Después de ejecutar este comando, la tabla será creada, pero aún estará vacía.


Tipos de Datos Comúnmente Usados

Al crear tablas, es importante elegir tipos de datos adecuados. Aquí hay algunos de los más comunes:

  • INT para números enteros;
  • VARCHAR(n) para cadenas de longitud variable de hasta n caracteres;
  • TEXT para valores de texto largos;
  • DATE para fechas del calendario;
  • TIMESTAMP para valores de fecha y hora, a menudo usados para almacenar cuándo se creó o actualizó una fila;
  • DECIMAL(p, s) para valores numéricos exactos, como dinero;
  • BOOLEAN para valores lógicos TRUE o FALSE.

Elegir el tipo de dato correcto ayuda a ahorrar espacio, mantener la calidad de los datos y evitar errores. Puedes leer más sobre tipos de datos aquí.


Restricciones de Columna

Las restricciones definen reglas para los datos almacenados en una tabla.

1. PRIMARY KEY

Una clave primaria identifica de manera única cada fila en una tabla.

CREATE TABLE students (
    student_id INT PRIMARY KEY,
    first_name VARCHAR(50),
    last_name VARCHAR(50)
);

La columna student_id no puede contener valores duplicados o NULL.

2. NOT NULL

Esta restricción requiere que una columna siempre contenga un valor.

CREATE TABLE students (
    student_id INT PRIMARY KEY,
    first_name VARCHAR(50) NOT NULL,
    last_name VARCHAR(50) NOT NULL
);

Ahora first_name y last_name no pueden quedar vacíos.

3. CHECK

La restricción CHECK define una condición que los valores en una columna deben satisfacer.

CREATE TABLE products (
    product_id INT PRIMARY KEY,
    product_name VARCHAR(100) NOT NULL,
    price DECIMAL(10, 2) CHECK (price >= 0)
);

En este ejemplo, la base de datos no permitirá almacenar un producto con un precio negativo.


Parámetros Adicionales de Columna

Además de las restricciones, las columnas pueden tener parámetros extra. Estos no prohíben ni permiten directamente valores, pero ayudan a definir el comportamiento de la columna de manera más precisa.

1. DEFAULT

El parámetro DEFAULT define el valor que se utilizará si no se proporciona un valor durante la inserción.

CREATE TABLE products (
    product_id INT PRIMARY KEY,
    product_name VARCHAR(100) NOT NULL,
    price DECIMAL(10, 2) DEFAULT 0.00
);

Si no se proporciona un precio al agregar un producto, la base de datos utilizará automáticamente 0.00.

2. CHARACTER SET y COLLATE

Para columnas de texto, puedes especificar explícitamente el conjunto de caracteres y las reglas de colación.

CREATE TABLE customers (
    customer_id INT PRIMARY KEY,
    first_name VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,
    last_name VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
);

Aquí, CHARACTER SET define la codificación utilizada para almacenar datos de texto, mientras que COLLATE define cómo se comparan y ordenan las cadenas. Esto es especialmente importante cuando una tabla necesita funcionar correctamente con diferentes idiomas y caracteres.


Ejemplo de una Tabla con Múltiples Reglas

Aquí hay un ejemplo más realista de una tabla employees:

CREATE TABLE employees (
    employee_id INT PRIMARY KEY,
    first_name VARCHAR(50) NOT NULL,
    last_name VARCHAR(50) NOT NULL,
    email VARCHAR(100) UNIQUE,
    hire_date DATE NOT NULL,
    salary DECIMAL(10, 2) DEFAULT 0.00
);

Lo que está sucediendo aquí:

  • employee_id es el identificador único para un empleado;
  • first_name y last_name son obligatorios;
  • email debe ser único;
  • hire_date es obligatorio;
  • salary tiene un valor por defecto de 0.00.

Esta estructura refleja mejor los requisitos de datos del mundo real.


Usando IF NOT EXISTS

En muchos sistemas de bases de datos, puedes evitar un error si la tabla ya existe usando IF NOT EXISTS:

CREATE TABLE IF NOT EXISTS departments (
    department_id INT PRIMARY KEY,
    department_name VARCHAR(100) NOT NULL
);

Esto es útil al volver a ejecutar scripts de práctica o migraciones.


Qué Tener en Cuenta

Al crear tablas, es útil tener en cuenta algunas reglas:

  • elige tipos de datos de manera reflexiva, en lugar de hacer todo demasiado genérico;
  • define una PRIMARY KEY para tablas donde cada fila debe ser identificada de manera única;
  • usa NOT NULL para campos realmente requeridos;
  • usa DEFAULT cuando una columna tiene un valor por defecto natural;
  • establece explícitamente CHARACTER SET y COLLATE para campos de texto cuando sea necesario;
  • intenta hacer que la estructura sea clara y predecible desde el principio.

Una tabla bien diseñada reduce errores y facilita el trabajo posterior con INSERT, UPDATE y SELECT.


Ejemplo Práctico

Imagina que queremos crear una tabla para almacenar libros:

CREATE TABLE books (
    book_id INT PRIMARY KEY,
    title VARCHAR(200) NOT NULL,
    author VARCHAR(100) NOT NULL,
    published_date DATE,
    price DECIMAL(8, 2) DEFAULT 0.00
);

Una vez que esta tabla esté creada, podemos comenzar a agregar filas a ella usando INSERT INTO.


Conclusiones Clave de esta Lección:

  • La sentencia CREATE TABLE se utiliza para crear nuevas tablas en una base de datos.
  • Cada columna debe tener un nombre y un tipo de dato.
  • Restricciones como PRIMARY KEY, NOT NULL, UNIQUE y CHECK ayudan a controlar la calidad de los datos.
  • Parámetros adicionales de columna como DEFAULT, CHARACTER SET y COLLATE ayudan a afinar el almacenamiento y comportamiento de los datos.
  • Una tabla bien diseñada hace que el trabajo futuro con los datos sea más simple y confiable.
  • IF NOT EXISTS ayuda a evitar errores al crear una tabla más de una vez.