queryLab · software_de_entrenamiento en espera
Nivel 3 · Gestión de datos · SQL · DDL

[SQL 11] Definir estructuras y restricciones

CREATE TABLE con PK, FK, NOT NULL, UNIQUE, CHECK y DEFAULT; ALTER, DROP y TRUNCATE.
0 / 7 retos resueltos 📘 Clases 8, 9 y 10 · DDL, restricciones y ejercicios 1–10 · Solemne 2 (ALTER TABLE)
Al terminar esta práctica podrás…
  • Crear tablas con tipos de datos y restricciones: PRIMARY KEY, FOREIGN KEY, NOT NULL, UNIQUE, CHECK, DEFAULT.
  • Definir claves primarias compuestas y claves foráneas que implementan relaciones 1:N y N:M.
  • Modificar estructuras con ALTER TABLE (agregar, renombrar y eliminar columnas) y eliminarlas con DROP.
  • Reconocer la sintaxis de MySQL y Oracle que se pregunta en la solemne (MODIFY, CHANGE, ADD PRIMARY KEY).

El DDL (Data Definition Language) crea y modifica la estructura: tablas, columnas, restricciones, vistas e índices. Es el paso que lleva tu modelo relacional (el que derivas en el editor MER) a una base de datos real.

Las restricciones (constraints) son reglas que el motor hace cumplir siempre:

  • PRIMARY KEY: identifica cada fila (única y no nula). Puede ser compuesta.
  • FOREIGN KEY … REFERENCES: el valor debe existir en la tabla referenciada.
  • NOT NULL: obligatorio. UNIQUE: sin repetidos. CHECK (expr): regla de negocio.
  • DEFAULT valor: valor por omisión si no se indica uno al insertar.

DROP TABLE elimina la tabla completa (estructura y datos); TRUNCATE TABLE (MySQL, Oracle) vacía los datos manteniendo la estructura, sin registrar cada fila en el log de transacciones; DELETE borra fila por fila y se puede filtrar y deshacer. SQLite no tiene TRUNCATE: DELETE FROM t; cumple esa función.

Sintaxis
CREATE TABLE tabla (
  id      INTEGER PRIMARY KEY,
  nombre  VARCHAR(50) NOT NULL,
  email   VARCHAR(100) UNIQUE,
  precio  DECIMAL(10,2) CHECK (precio > 0),
  activo  BOOLEAN DEFAULT 1,
  fk_id   INTEGER REFERENCES otra(id)
);
ALTER TABLE tabla ADD COLUMN col TIPO;
ALTER TABLE tabla RENAME COLUMN vieja TO nueva;
DROP TABLE IF EXISTS tabla;
PRIMARY KEY (a, b)
Clave compuesta: la combinación identifica la fila (tablas intermedias N:M).
REFERENCES
FK: FOREIGN KEY (dept_id) REFERENCES departments(department_id).
CHECK
CHECK (anio > 1990), CHECK (salario > 0).
DEFAULT
DEFAULT 0, DEFAULT CURRENT_TIMESTAMP.
ALTER TABLE
ADD / RENAME / DROP COLUMN; en MySQL también MODIFY y CHANGE.
DROP vs TRUNCATE vs DELETE
Estructura + datos · solo datos (rápido) · filas filtrables.
MySQL
ALTER TABLE t MODIFY COLUMN col VARCHAR(15); ALTER TABLE t CHANGE COLUMN vieja nueva VARCHAR(255);
Oracle
ALTER TABLE t MODIFY (col VARCHAR2(15)); ALTER TABLE t RENAME COLUMN vieja TO nueva;
SQLite / PostgreSQL
ALTER TABLE t RENAME COLUMN vieja TO nueva; (sin MODIFY: se recrea la tabla)
Todos
ALTER TABLE t ADD PRIMARY KEY (col); ALTER TABLE t ADD CONSTRAINT chk CHECK (precio > 0);

1 · Ejemplos guiados · ejecuta y modifica cada bloque

01Tabla con todas las restricciones
Clave primaria, obligatorios, únicos, regla CHECK, valor por defecto y clave foránea hacia departments.
sql-ddl.sql
Presiona «ejecutar» para ver el resultado.
02Violación de CHECK
Un presupuesto negativo viola la regla. Error esperado.
sql-ddl.sql
Presiona «ejecutar» para ver el resultado.
03Violación de clave foránea
El departamento 999 no existe: la FK lo impide. Error esperado.
sql-ddl.sql
Presiona «ejecutar» para ver el resultado.
04Clave primaria compuesta (tabla N:M)
La combinación estudiante + curso identifica la inscripción (clase 10, ejercicio 7).
sql-ddl.sql
Presiona «ejecutar» para ver el resultado.
05ALTER TABLE: agregar y renombrar
Agregamos una columna (clase 9: ALTER TABLE … ADD descripcion VARCHAR(40)) y renombramos otra. Con pragma_table_info vemos la estructura (equivale a DESCRIBE de MySQL).
sql-ddl.sql
Presiona «ejecutar» para ver el resultado.
06Eliminar columnas y tablas
DROP COLUMN elimina una columna; DROP TABLE IF EXISTS elimina la tabla sin error si no existe.
sql-ddl.sql
Presiona «ejecutar» para ver el resultado.

⚠ Errores frecuentes

  • Crear la tabla hija antes que la padre: la FK apunta a una tabla que aún no existe. Crea primero las tablas «uno».
  • Usar un tipo de FK distinto al de la PK referenciada (INT vs VARCHAR).
  • Confundir DROP (elimina la tabla) con TRUNCATE / DELETE (vacían los datos).
  • Escribir ALTER estudiante ADD … sin la palabra TABLE, o ADD COLUMN INTO: ambas son sintaxis inválidas (aparecen como distractores en la solemne).
  • Para TRUNCATE con FK en MySQL hay que desactivar temporalmente la revisión: SET FOREIGN_KEY_CHECKS = 0; … = 1;

2 · Retos con corrección automática

Escribe tu solución y pulsa comprobar (Ctrl + Enter). Tu consulta y la solución se ejecutan en bases limpias y se comparan los resultados: no importan los nombres de las columnas, sí los datos (y el orden, cuando el reto lo pide). Si te atascas, usa la pista o mira el resultado esperado.

3 · Preguntas tipo solemne

1. (Solemne 2) ¿Cuál instrucción implementa la clave primaria de la tabla institucion sobre inst_codigo?
2. (Solemne 2, MySQL) ¿Cuál cambia el tipo de est_rango_edad a INTEGER en la tabla estudiante?
3. (Solemne 2) ¿Cuál agrega el atributo est_nombre a la tabla estudiante?
4. ¿Qué diferencia a TRUNCATE de DELETE sin WHERE?
5. ¿Qué restricción garantiza que precio sea siempre mayor que 0?