3.1 CREATE TABLE¶
CREATE TABLE define una tabla nueva: su nombre, sus columnas, el tipo de cada una y las reglas que deben cumplir los datos.
CREATE TABLE nombre_tabla (
columna1 TIPO restricciones,
columna2 TIPO restricciones,
...
restricciones_de_tabla
);
Un ejemplo con todas las piezas¶
Se crea una tabla de clubes del instituto, con una regla para casi cada columna:
CREATE TABLE clubes (
id INTEGER PRIMARY KEY AUTOINCREMENT,
nombre TEXT NOT NULL UNIQUE,
cuota REAL NOT NULL DEFAULT 0 CHECK (cuota >= 0),
fundado TEXT NOT NULL,
id_profesor INTEGER REFERENCES profesores(id)
);
SELECT name AS tabla FROM sqlite_master WHERE type = 'table' ORDER BY name;
Resultado:
| tabla |
|---|
| alumnos |
| asignaturas |
| clubes |
| grupos |
| notas |
| profesores |
| sqlite_sequence |
7 filas
| Columna | Reglas | Significado |
|---|---|---|
id |
PRIMARY KEY AUTOINCREMENT |
Identifica cada club y se numera sola |
nombre |
NOT NULL UNIQUE |
Obligatorio y no se repite |
cuota |
NOT NULL DEFAULT 0 CHECK (cuota >= 0) |
Si no se indica vale 0, y nunca puede ser negativa |
fundado |
NOT NULL |
Obligatorio |
id_profesor |
REFERENCES profesores(id) |
Clave foránea: debe ser un profesor existente (o NULL) |
Tipos de datos¶
Cada motor tiene su lista de tipos. Los principales, y cómo se escriben en cada uno:
| Qué guardas | SQLite | MySQL | PostgreSQL | Oracle |
|---|---|---|---|---|
| Entero | INTEGER |
INT |
INTEGER |
NUMBER(10) |
| Decimal exacto (dinero) | NUMERIC |
DECIMAL(10,2) |
NUMERIC(10,2) |
NUMBER(10,2) |
| Decimal aproximado | REAL |
DOUBLE |
DOUBLE PRECISION |
BINARY_DOUBLE |
| Texto | TEXT |
VARCHAR(100) |
VARCHAR(100) o TEXT |
VARCHAR2(100) |
| Fecha | TEXT (AAAA-MM-DD) |
DATE |
DATE |
DATE |
| Fecha y hora | TEXT |
DATETIME |
TIMESTAMP |
TIMESTAMP |
| Verdadero o falso | INTEGER (0 y 1) |
BOOLEAN (es un TINYINT) |
BOOLEAN |
NUMBER(1) |
SQLite es más flexible que los demás
SQLite tiene solo unos pocos tipos y no obliga a que un valor coincida con el tipo de su columna (guarda lo que le des). En MySQL, PostgreSQL u Oracle el tipo se comprueba: no puedes meter 'hola' en una columna INT. Conviene escribir los datos como si el motor fuera estricto.
Las restricciones¶
| Restricción | Qué impone |
|---|---|
PRIMARY KEY |
Identifica cada fila: única y no nula. Solo una por tabla (puede ser de varias columnas) |
NOT NULL |
La columna no puede quedar vacía |
UNIQUE |
No puede haber dos filas con el mismo valor (admite NULL) |
DEFAULT valor |
Valor que se usa cuando no se indica ninguno |
CHECK (condición) |
El valor debe cumplir una condición |
REFERENCES tabla(columna) |
Clave foránea: el valor debe existir en la otra tabla |
Cuando se incumple una, el motor rechaza la operación y devuelve un error. Estos son los mensajes reales de SQLite para cada caso (en otros motores el texto cambia, pero el comportamiento es el mismo):
Valor repetido en una columna UNIQUE:
INSERT INTO clubes (nombre, fundado) VALUES ('Ajedrez', '2020-09-01');
INSERT INTO clubes (nombre, fundado) VALUES ('Ajedrez', '2021-01-10');
Resultado: error
IntegrityError: UNIQUE constraint failed: clubes.nombre
Falta un valor obligatorio (NOT NULL):
INSERT INTO clubes (nombre) VALUES ('Teatro');
Resultado: error
IntegrityError: NOT NULL constraint failed: clubes.fundado
Valor que incumple el CHECK:
INSERT INTO clubes (nombre, cuota, fundado) VALUES ('Lectura', -5, '2022-03-01');
Resultado: error
IntegrityError: CHECK constraint failed: cuota >= 0
Clave foránea a una fila que no existe:
INSERT INTO clubes (nombre, fundado, id_profesor) VALUES ('Robótica', '2023-02-01', 99);
Resultado: error
IntegrityError: FOREIGN KEY constraint failed
Gracias a estas reglas, la base de datos se defiende sola de datos incorrectos, sin depender de que cada programa se acuerde de comprobarlos.
Claves que se numeran solas¶
Cómo se escribe «número automático» depende del motor:
| Motor | Escritura |
|---|---|
| SQLite | id INTEGER PRIMARY KEY AUTOINCREMENT (o solo INTEGER PRIMARY KEY) |
| MySQL | id INT PRIMARY KEY AUTO_INCREMENT |
| PostgreSQL | id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY (o SERIAL) |
| Oracle | id NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY |
Restricciones de varias columnas¶
Las que afectan a más de una columna se escriben al final, como restricciones de tabla. Aquí, una clave primaria compuesta y un UNIQUE sobre el par:
CREATE TABLE inscripciones (
id_alumno INTEGER NOT NULL REFERENCES alumnos(id),
id_club INTEGER NOT NULL,
desde TEXT NOT NULL,
PRIMARY KEY (id_alumno, id_club)
);
INSERT INTO inscripciones VALUES (1, 10, '2025-09-15'), (2, 10, '2025-09-16');
SELECT * FROM inscripciones;
Resultado:
| id_alumno | id_club | desde |
|---|---|---|
| 1 | 10 | 2025-09-15 |
| 2 | 10 | 2025-09-16 |
2 filas
Crear solo si no existe¶
CREATE TABLE IF NOT EXISTS ... no hace nada (y no da error) si la tabla ya existe: útil en programas que se ejecutan muchas veces y deben dejar la base de datos preparada.
Errores frecuentes¶
| Error | Cómo evitarlo |
|---|---|
| Crear una tabla sin clave primaria | Toda tabla debe tener una |
Dejar columnas sin NOT NULL por pereza |
Marca como obligatorio todo lo que lo sea |
Guardar dinero en REAL |
DECIMAL/NUMERIC (o céntimos como entero) |
| Crear la tabla «hija» antes que la «padre» | Primero las tablas a las que se hace referencia |
| Fiarse de que el programa validará todo | Poner las reglas también en la base de datos |
Para practicar¶
Los ejercicios S3.1, S3.9 y S3.11 de S3 · Ejercicios practican CREATE TABLE.