[SQL 11] Definir estructuras y restricciones
- 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 conDROP. - 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.
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;
FOREIGN KEY (dept_id) REFERENCES departments(department_id).CHECK (anio > 1990), CHECK (salario > 0).DEFAULT 0, DEFAULT CURRENT_TIMESTAMP.ALTER TABLE t MODIFY COLUMN col VARCHAR(15); ALTER TABLE t CHANGE COLUMN vieja nueva VARCHAR(255);ALTER TABLE t MODIFY (col VARCHAR2(15)); ALTER TABLE t RENAME COLUMN vieja TO nueva;ALTER TABLE t RENAME COLUMN vieja TO nueva; (sin MODIFY: se recrea la tabla)ALTER TABLE t ADD PRIMARY KEY (col); ALTER TABLE t ADD CONSTRAINT chk CHECK (precio > 0);1 · Ejemplos guiados · ejecuta y modifica cada bloque
departments.ALTER TABLE … ADD descripcion VARCHAR(40)) y renombramos otra. Con pragma_table_info vemos la estructura (equivale a DESCRIBE de MySQL).⚠ 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) conTRUNCATE/DELETE(vacían los datos). - Escribir
ALTER estudiante ADD …sin la palabra TABLE, oADD 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
institucion sobre inst_codigo?ALTER TABLE y la acción ADD PRIMARY KEY (columnas).est_rango_edad a INTEGER en la tabla estudiante?CHANGE COLUMN repite el nombre (viejo y nuevo) y el tipo. También vale ALTER TABLE estudiante MODIFY COLUMN est_rango_edad INTEGER.est_nombre a la tabla estudiante?TRUNCATE de DELETE sin WHERE?precio sea siempre mayor que 0?