CodeGym /Cursos /SQL SELF /Insertar datos en tablas con restricciones: NOT NU...

Insertar datos en tablas con restricciones: NOT NULL, DEFAULT

SQL SELF
Nivel 21, Lección 1
Disponible

Hoy vamos a ver en detalle otro aspecto importante del trabajo con bases de datos: cómo insertar datos en tablas que tienen restricciones NOT NULL y DEFAULT. A estas alturas ya conoces la sintaxis básica del comando INSERT INTO, y entiendes cómo añadir filas a tablas con una estructura definida. Ahora toca profundizar un poco más, porque trabajar con restricciones suele ser una fuente de dolores de cabeza para los devs. Pero tranqui, al final de la lección vas a manejar estos mecanismos sin problema.

¿Qué son las restricciones?

Las restricciones son reglas que se aplican a las columnas de una tabla. Ayudan a mantener los datos en un formato lógico y correcto. Por ejemplo, no puedes dejar vacío un campo que debe tener datos sí o sí (NOT NULL), o puedes no indicar un valor para una columna si ya tiene un valor por defecto definido (DEFAULT).

Tipos de restricciones: - NOT NULL — indica que la columna no puede contener NULL. - DEFAULT — define un valor que se insertará automáticamente en la columna si no lo especificas.

Las restricciones ayudan a mantener la integridad de los datos. Imagina que guardas una lista de estudiantes en la tabla students, y una de las reglas es que cada estudiante debe tener sí o sí un nombre (NOT NULL). Sin esa restricción, alguien podría olvidarse de poner el nombre y en la base aparecería un "estudiante sin nombre". Otro ejemplo: decides que el valor estándar para los créditos de un curso nuevo es 0 (DEFAULT), así no tienes que pensarlo cada vez.

Trabajando con la restricción NOT NULL

La restricción NOT NULL te obliga a poner un valor en esa columna cuando insertas un registro. Si intentas insertar NULL o simplemente no pones nada, la base de datos "se enfada" (te da un error). Vamos a ver un ejemplo.

Vamos a crear una tabla sencilla students:

CREATE TABLE students (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,     -- El nombre no puede estar vacío
    age INT
);

Fíjate: la columna name tiene la restricción NOT NULL, pero la columna age no tiene ninguna restricción.

Ejemplo de inserción de datos con NOT NULL

Ahora vamos a añadir estudiantes:

-- Ejemplo de inserción exitosa
INSERT INTO students (name, age) VALUES ('Alice', 23);
-- Éxito: el nombre está puesto, cumple la restricción NOT NULL

-- Ejemplo de error:
INSERT INTO students (age) VALUES (30);
-- Error: el campo name no puede ser NULL porque tiene la restricción NOT NULL

Cuando veas un error como null value in column "name" violates not-null constraint, no te asustes — simplemente PostgreSQL te está recordando que pongas atención.

Usando valores por defecto (DEFAULT)

La restricción DEFAULT le dice a la base de datos: "Si se olvidan de poner un valor para esta columna, usa este valor". Esto le hace la vida más fácil a los devs porque no tienes que rellenar cada fila a mano.

Ejemplo de tabla con restricción DEFAULT

Vamos a crear la tabla courses:

CREATE TABLE courses (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,
    credits INT DEFAULT 0   -- Valor por defecto para la columna credits — 0
);

Ejemplo de inserción de datos con DEFAULT

Ahora vamos a añadir cursos:

-- Indicamos explícitamente el valor de credits
INSERT INTO courses (name, credits) VALUES ('Mathematics', 5);

-- No indicamos el valor de credits — se usará el valor por defecto (0)
INSERT INTO courses (name) VALUES ('History');

-- Veamos el resultado
SELECT * FROM courses;

Resultado:

id name credits
1 Mathematics 5
2 History 0

Fíjate: al añadir el curso History no pusimos el número de créditos. PostgreSQL rellenó automáticamente la columna credits con el valor 0.

Usando juntas las restricciones NOT NULL y DEFAULT

Estas columnas requieren un valor, aunque no lo pongas tú. Por ejemplo, en la tabla courses la columna credits puede tener tanto DEFAULT como NOT NULL, para asegurarte de que nadie la deja vacía por accidente (NULL).

CREATE TABLE courses (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,
    credits INT NOT NULL DEFAULT 0
);

Ejemplo de inserción de datos

Imagina que cada curso nuevo debe tener por defecto 0 créditos, pero NULL no está permitido.

-- Correcto: los créditos toman el valor por defecto
INSERT INTO courses (name) VALUES ('Physics');

-- Error: intentamos meter NULL en una columna NOT NULL
INSERT INTO courses (name, credits) VALUES ('Chemistry', NULL);

Ejemplo: Añadir un estudiante con nombre obligatorio

Vamos a crear la tabla students con restricciones:

CREATE TABLE students (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,                         -- El nombre es obligatorio
    enrollment_date DATE DEFAULT CURRENT_DATE   -- La fecha de inscripción por defecto es la actual
);

Ahora vamos a añadir estudiantes:

-- El nombre está puesto, la fecha de inscripción se rellena automáticamente
INSERT INTO students (name) VALUES ('Bob');

-- Intentamos no poner el nombre (da error)
INSERT INTO students (enrollment_date) VALUES ('2024-10-01');

Un ejemplo perfecto de cómo PostgreSQL te ayuda a garantizar la corrección de los datos: todos los estudiantes tienen nombre sí o sí, y la fecha de inscripción no hace falta ponerla a mano.

Consejos y "trampas"

Cuando trabajas con restricciones NOT NULL y DEFAULT, hay que tener en cuenta algunas cosas importantes. Por ejemplo, si en tus datos suele aparecer NULL, la restricción NOT NULL puede ser un dolor de cabeza. Y si pones un valor por defecto para todas las columnas, puedes acabar con datos incorrectos (por ejemplo, 0 en vez de un valor real).

Normalmente, si añades una columna nueva a una tabla que ya existe, las celdas para las filas existentes se rellenan con NULL. Pero si pones DEFAULT X, toda la columna se rellena con el valor X. Esto es súper útil y ayuda a mantener la integridad de la base.

Por ejemplo, una columna nueva puede ser una FOREIGN KEY a otra tabla existente. Y no puede tener NULL ni 0. Tiene que referenciar a filas que ya existen en la otra tabla.

¿Qué hacer si te olvidaste de poner restricciones?

No te preocupes — siempre puedes añadir restricciones después usando el comando ALTER TABLE. Por ejemplo:

-- Añadir restricción DEFAULT a una columna existente
ALTER TABLE courses ALTER COLUMN credits SET DEFAULT 0;

-- Añadir restricción NOT NULL a una columna existente
ALTER TABLE students ALTER COLUMN name SET NOT NULL;

Estas consultas no rompen los datos que ya tienes — puedes usarlas en tablas que ya contienen información importante.

¡Ahora ya puedes usar la potencia de PostgreSQL para gestionar restricciones! Tus datos serán más estructurados y protegidos contra errores, y tus consultas serán lógicas y predecibles.

2
Tarea
SQL SELF, nivel 21, lección 1
Bloqueada
Uso conjunto de `NOT NULL` y `DEFAULT`
Uso conjunto de `NOT NULL` y `DEFAULT`
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION