Crear y modificar tablas de base de datos: restricciones

Aprende a crear tus propias tablas de base de datos y a modificar sus datos de forma segura. Escribe sentencias CREATE TABLE con tipos de datos adecuados, protege los datos con NOT NULL, UNIQUE, CHECK, claves primarias (llaves primarias) y claves foráneas (claves externas), y añade, modifica y elimina filas con INSERT, UPDATE y DELETE. Practica cómo seleccionar exactamente las filas adecuadas, agrupa cambios relacionados en transacciones que puedas confirmar o revertir y modifica o elimina tablas con ALTER TABLE y DROP TABLE. Los ejemplos utilizan SQL estándar que funciona en SQLite y PostgreSQL, y señalan las diferencias de MySQL, SQL Server y Oracle cuando son relevantes.

PrincipianteUnidad 6 de 6 del curso Curso de Fundamentos de SQL

Lo que aprenderás

  1. Escribe sentencias CREATE TABLE que definan una tabla y sus columnas, y elige para cada columna un tipo de datos adecuado para los valores que almacenará.
    • Escribe una sentencia CREATE TABLE
      Define una tabla nueva con columnas con nombre, comprueba su estructura y evita los errores de sintaxis más habituales entre principiantes.
    • Elige un tipo de datos para cada columna
      Elige tipos enteros, decimales exactos, de coma flotante, de texto, de fecha y de verdadero/falso para los valores de una columna, y comprende cómo se diferencia el tipado flexible de SQLite del de bases de datos más estrictas.
  2. Utiliza restricciones para que la propia base de datos rechace valores ausentes, duplicados, fuera de intervalo o sin correspondencia, y asigna a cada fila una clave fiable.
    • Exige valores, establece valores predeterminados y limita los valores permitidos con NOT NULL, DEFAULT, UNIQUE y CHECK
      Declara las reglas de columna y tabla que mantienen los valores presentes, distintos y dentro del intervalo permitido, y predice qué inserciones rechazará una regla.
    • Identifica filas mediante claves primarias e identificadores generados
      Declara claves primarias de una columna y compuestas, deja que la base de datos numere las filas nuevas y comprende qué garantizan y qué no los identificadores generados en cada sistema de bases de datos.
    • Vincula tablas mediante claves foráneas
      Declara claves foráneas que mantengan válidas las referencias entre tablas, elige qué ocurre cuando se elimina una fila referenciada y activa su aplicación donde esté desactivada.
  3. Añade filas nuevas con INSERT, de una en una, varias a la vez o copiadas de una consulta, y gestiona las claves generadas y los duplicados.
    • Inserta filas con VALUES
      Escribe sentencias INSERT ... VALUES con una lista de columnas y texto, números, fechas y NULL escritos correctamente, e interpreta los errores que impiden una inserción.
    • Inserta datos desde consultas, obtén las nuevas claves y gestiona los duplicados
      Copia filas con INSERT ... SELECT, recupera los valores generados con RETURNING y decide qué ocurre cuando una fila insertada entra en conflicto con una existente.
  4. Modifica valores con UPDATE y elimina filas con DELETE, y asegúrate de que cada sentencia afecte exactamente a las filas previstas.
    • Modifica valores con UPDATE
      Escribe sentencias UPDATE que asignen valores a una o varias columnas, calculen valores nuevos a partir de los anteriores y respeten las restricciones de la tabla.
    • Elimina filas con DELETE
      Elimina las filas elegidas con DELETE, distingue entre DELETE, TRUNCATE y DROP TABLE, y decide cuándo conviene marcar una fila como eliminada en lugar de borrarla.
    • Selecciona exactamente las filas que quieres modificar o eliminar
      Construye condiciones WHERE para cambios que seleccionen las filas previstas y ninguna otra, y comprueba el resultado antes de conservarlo.
  5. Utiliza transacciones para conservar o deshacer en su conjunto un grupo de cambios relacionados y recuperarte de forma ordenada cuando falle una sentencia.
    • Confirma o revierte un grupo de cambios
      Inicia una transacción, conserva sus cambios con COMMIT o deshazlos con ROLLBACK, y comprende la confirmación automática.
    • Gestiona errores, puntos de guardado y cambios de estructura en una transacción
      Responde correctamente cuando falle una sentencia dentro de una transacción, deshaz parte de una transacción con un punto de guardado y comprende qué bases de datos pueden revertir CREATE, ALTER y DROP.
  6. Modifica la estructura de las tablas existentes sin perder sus filas y elimina tablas de forma segura cuando ya no sean necesarias.
    • Añade, renombra y elimina columnas con ALTER TABLE
      Utiliza ALTER TABLE para añadir, renombrar y eliminar columnas y para modificar tipos y restricciones, y sortea las limitaciones de SQLite.
    • Elimina tablas con DROP TABLE
      Elimina tablas con DROP TABLE, respeta las dependencias entre tablas y elige entre eliminar una tabla, vaciarla y eliminar filas.

Guía de estudio de Crear y modificar tablas de base de datos

6 capítulos

1

Crea tablas con tipos de datos adecuados para sus columnas

Una tabla necesita una estructura clara antes de poder contener datos útiles. Empieza por los datos que registra una fila, asigna un nombre a cada uno y elige cómo los almacenará la base de datos. Crearás una tabla vacía, inspeccionarás lo que se ha creado realmente y distinguirás un número utilizado para calcular de un texto que solo parece numérico. SQLite y PostgreSQL comparten gran parte de la sintaxis, pero sus reglas de tipos pueden producir resultados muy distintos.

1.1 Escribe una sentencia CREATE TABLE

La definición de una tabla describe qué puede contener cada fila. No añade ninguna fila. En una tienda en línea, cada producto necesita campos separados para su identificador, nombre, precio y cantidad en existencias.

Construye la definición
CREATE TABLE products (
  id INTEGER PRIMARY KEY,
  name TEXT NOT NULL,
  price NUMERIC(8, 2) NOT NULL,
  in_stock INTEGER DEFAULT 0
);

Lee de fuera hacia dentro. CREATE TABLE products da nombre a la tabla nueva. Los paréntesis contienen las definiciones de sus columnas. Cada línea indica un nombre de columna, un tipo y las reglas de esa columna. Las comas separan las definiciones; la última no lleva coma. El punto y coma termina la sentencia. Tras ejecutarse correctamente, SELECT * FROM products; devuelve cero filas.

Esta declaración de clave genera identificadores en SQLite. En PostgreSQL, utiliza id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY para generarlos. La declaración decimal también se comporta de forma distinta en estos sistemas; elegir un almacenamiento exacto forma parte de la elección del tipo.

Asigna una columna a cada dato

Una fila de cliente podría contener id, first_name, last_name, email y signup_date. Agrupar «Ana Ruiz, ana@example.com» en un campo dificulta buscar o comprobar el nombre y el correo por separado. Nombra los campos según lo que contienen. Los nombres cortos en minúsculas unidos por guiones bajos, como unit_price, son fáciles de reutilizar.

Evita las palabras clave como nombres: orders funciona, mientras que order sin comillas entra en conflicto con la palabra clave ORDER de SQL. Un nombre con espacios necesita comillas dobles, como en "order date", cada vez que lo utilices. PostgreSQL convierte los nombres sin comillas a minúsculas, por lo que Products y products sin comillas hacen referencia al mismo nombre.

Las comillas simples tienen otra función: encierran valores de texto como 'Desk lamp'. Las comillas dobles identifican nombres. PostgreSQL interpreta "Desk lamp" como un nombre de columna, no como el texto de un producto.

Comprueba lo que se ha creado

Una coma final antes de ) provoca un error de sintaxis. La falta de una coma también suele hacerlo, pero SQLite puede interpretar varias palabras como un único nombre de tipo. CREATE TABLE t (a INTEGER b TEXT); crea una columna llamada a, no dos columnas. Inspecciona la definición:

  • Consola de SQLite: .schema products muestra la sentencia de creación.
  • SQL de SQLite: PRAGMA table_info(products); enumera columnas y tipos.
  • psql de PostgreSQL: \d products muestra columnas, tipos y restricciones.

CREATE TABLE IF NOT EXISTS products (...) evita un error cuando el nombre ya existe. No compara ni actualiza la definición anterior. Una tabla a la que le falte una columna necesaria seguirá igual.

Crea una copia puntual
CREATE TABLE cheap_products AS
SELECT name, price FROM products WHERE price < 10;

Esto crea columnas y copia las filas de la consulta. Los cambios posteriores en los productos no actualizan la copia. En SQLite y PostgreSQL, la tabla nueva no hereda la clave primaria ni las reglas NOT NULL o CHECK del origen.

CREATE, ALTER y DROP pertenecen al lenguaje de definición de datos, o DDL: modifican la estructura. INSERT, UPDATE y DELETE pertenecen al lenguaje de manipulación de datos, o DML: modifican filas. SELECT lee datos; los libros difieren en si lo incluyen en DML o asignan a las consultas su propia familia.

Puntos clave

  • Las definiciones de columna contienen un nombre, un tipo y reglas opcionales.
  • Utiliza comas entre las definiciones, sin coma al final.
  • Las comillas simples encierran texto; las dobles, identificadores.
  • Inspecciona la estructura resultante, también después de una sentencia IF NOT EXISTS.
  • CREATE TABLE AS copia los datos de la consulta sin copiar las restricciones del origen.

1.2 Elige un tipo de datos para cada columna

Elige un tipo según la función que deba cumplir el valor. Una cantidad debe permitir cálculos aritméticos. Un código postal de EE. UU. debe conservar sus caracteres, incluidos los ceros iniciales. Ambos pueden contener cifras, pero necesitan almacenamientos distintos.

Elige tipos numéricos y de texto
ValoresTipo útilMotivo
Recuentos enterosINTEGERLos recuentos no tienen parte fraccionaria.
Importes monetarios exactos en PostgreSQLNUMERIC(p, s)La aritmética decimal conserva los importes exactos.
Importes monetarios exactos en SQLiteCéntimos en INTEGERLos céntimos enteros evitan el almacenamiento en coma flotante.
MedidasREAL o DOUBLE PRECISIONLos valores aproximados son adecuados para cantidades medidas.
Nombres y códigosTEXT o VARCHAR(n)Se conservan los caracteres y los ceros iniciales.

En PostgreSQL, NUMERIC(8, 2) tiene ocho cifras en total, dos tras la coma decimal. Su mayor valor positivo es 999 999,99. Insertar 12,345 almacena 12,35; 1 234 567,00 provoca un desbordamiento porque necesita siete cifras antes de la coma. DECIMAL es otro nombre de esta familia de tipos.

SQLite acepta NUMERIC(8, 2), pero no exige esa precisión ni esa escala. Almacena 19,99 en coma flotante y conserva 12,345 sin redondear. Almacena 1999 céntimos enteros para un importe exacto de 19,99. La coma flotante aproxima fracciones binarias: SELECT 0.1 + 0.2 = 0.3; de SQLite devuelve 0. PostgreSQL trata esos literales decimales sin conversión como valores numéricos exactos; conviértelos a DOUBLE PRECISION para ver el resultado aproximado.

Los números de texto se ordenan por caracteres: '100', '25', '9' aparecen en ese orden. Las cantidades numéricas necesitan columnas numéricas. El código postal '02139' debe ser texto; el almacenamiento como entero pierde su cero inicial.

El VARCHAR(20) de PostgreSQL rechaza textos de más de 20 caracteres. Su CHAR(n) rellena el texto más corto con espacios hasta una longitud fija. TEXT no tiene un límite de caracteres declarado. SQLite trata tanto VARCHAR(n) como CHAR(n) como texto, sin exigir la longitud ni añadir relleno.

Almacena fechas y valores sí/no

PostgreSQL tiene DATE, TIME, TIMESTAMP y BOOLEAN. Rechaza un DATE imposible como '2026-02-30'. SQLite no tiene un tipo de almacenamiento específico para fechas. Utiliza texto ISO como '2026-03-15', cuyo orden de caracteres coincide con el de las fechas. El texto de estilo estadounidense ordena mal las fechas de años distintos: '12/01/2025' se ordena después de '03/15/2026'.

Una marca de tiempo añade una hora, como en '2026-03-15 14:30:00'. PostgreSQL utiliza TRUE y FALSE para los booleanos; SQLite almacena 1 y 0 y acepta esas palabras clave. MySQL trata BOOLEAN como un entero pequeño; SQL Server utiliza BIT.

Comprende qué exige el sistema

Las tablas normales de SQLite utilizan afinidad de tipo, una preferencia de almacenamiento. Una columna INTEGER convierte '5' en 5, pero acepta 'abc' como texto. PostgreSQL rechaza el texto que no puede convertirse en un entero. SQLite 3.37.0 y posteriores admiten tablas STRICT, cuyos tipos permitidos son INT, INTEGER, REAL, TEXT, BLOB y ANY.

Para los pedidos, elige un id entero, un correo de texto, una fecha DATE de PostgreSQL o de texto ISO de SQLite, NUMERIC(10, 2) de PostgreSQL o céntimos enteros de SQLite para el total, y un booleano o un indicador 0/1 para el pago. NULL significa ausente o desconocido; no es un tipo ni equivale a cero o a una cadena vacía. Una columna lo acepta salvo que una regla lo prohíba.

Puntos clave

  • Elige los tipos según su uso: aritmética, texto, tiempo o sí/no.
  • La precisión de NUMERIC cuenta todas las cifras; la escala cuenta los decimales.
  • Utiliza NUMERIC de PostgreSQL o céntimos enteros de SQLite para importes monetarios exactos.
  • El texto de fecha ISO se ordena por fecha cuando se escribe de manera uniforme.
  • La afinidad de SQLite permite mezclar tipos de almacenamiento; STRICT refuerza las comprobaciones de tipo.
  • NULL marca un valor ausente o desconocido.
2

Protege los datos mediante restricciones

Una base de datos puede comprobar reglas en el momento en que cambian los datos, sea cual sea el programa que envíe el cambio. Las reglas de columna controlan valores ausentes, duplicados e intervalos; las claves identifican filas y mantienen válidos los vínculos entre tablas. Seguirás inserciones aceptadas y rechazadas, elegirás identificadores generados y predecirás qué ocurre con los pedidos cuando se elimina un cliente. Estas reglas trabajan juntas: comprobar el precio cumple una función distinta de exigir que el precio esté presente.

2.1 Exige valores, establece valores predeterminados y limita los valores permitidos con NOT NULL, DEFAULT, UNIQUE y CHECK

Una restricción hace que la base de datos rechace datos que incumplen una regla declarada. La comprobación se ejecuta al insertar o actualizar filas, independientemente de la aplicación que envíe la sentencia. Las distintas reglas protegen distintas partes de un registro de producto.

Combina reglas en una tabla

Esta definición de SQLite genera la clave y comprueba los demás campos. Para PostgreSQL, sustituye la línea de la clave por una clave primaria de identidad.

CREATE TABLE products (
  id INTEGER PRIMARY KEY,
  sku TEXT NOT NULL UNIQUE,
  name TEXT NOT NULL,
  price NUMERIC(8, 2) NOT NULL CHECK (price > 0),
  in_stock INTEGER NOT NULL DEFAULT 0 CHECK (in_stock >= 0)
);

NOT NULL exige un valor. UNIQUE impide repetir un SKU. CHECK (price > 0) rechaza los precios iguales a cero o negativos. Las existencias tienen un valor predeterminado de 0 y deben mantenerse no negativas. La declaración numérica de SQLite no proporciona aritmética decimal exacta, así que utiliza céntimos enteros cuando la exactitud sea importante.

Distingue entre omitir y asignar NULL

Inserta una lámpara de escritorio con SKU 'LAMP-01', nombre 'Desk lamp' y precio 24,99, omitiendo las existencias de la lista de columnas. La inserción se realiza correctamente y recibe existencias 0. Proporcionar existencias NULL no solicita el valor predeterminado: incumple NOT NULL.

Una taza de café con precio -3,50 incumple la comprobación del precio. Un segundo producto con SKU 'LAMP-01' incumple UNIQUE, aunque su nombre y precio sean distintos. Un bolígrafo sin nombre incumple NOT NULL. Lee la regla o columna mencionada en el error y corrige los datos de entrada.

La cadena vacía es un valor real. name TEXT NOT NULL acepta '' en SQLite y PostgreSQL. Añade CHECK (name <> '') para rechazarla. Oracle trata la cadena vacía como NULL, por lo que allí la misma entrada queda sujeta a otra regla.

Comprueba combinaciones y valores ausentes

Una regla de columna va después de su tipo. Una regla de tabla es un elemento independiente dentro de la definición de la tabla y puede comparar columnas:

CHECK (end_date >= start_date),
UNIQUE (order_id, product_id)

La primera rechaza una fecha de fin anterior a la de inicio. La segunda rechaza un par repetido: un producto puede aparecer en pedidos distintos, pero no dos veces en el mismo pedido. Una tabla puede tener varias restricciones de unicidad.

Una comprobación rechaza una fila cuando su condición es falsa. Si el precio es NULL, price > 0 es desconocido, por lo que se supera la comprobación. Por eso el precio del producto también necesita NOT NULL. PostgreSQL, SQLite y MySQL normalmente permiten varios valores NULL con UNIQUE; SQL Server permite uno en una restricción de unicidad de una sola columna. PostgreSQL 15 y posteriores ofrecen UNIQUE NULLS NOT DISTINCT cuando los valores ausentes también deben entrar en conflicto. Las versiones de MySQL anteriores a 8.0.16 ignoraban las reglas CHECK.

Asigna un nombre útil a una regla con CONSTRAINT price_positive CHECK (price > 0). El nombre ayuda a identificarla en un error y a eliminarla después. Una restricción comprueba exactamente su expresión: CHECK (email LIKE '%@%') detecta que falta una arroba, pero no puede detectar un error de escritura en una dirección que cumple el patrón.

Puntos clave

  • NOT NULL rechaza valores ausentes, pero no rechaza cadenas vacías en SQLite ni PostgreSQL.
  • DEFAULT rellena las columnas omitidas; un NULL explícito no solicita ese valor.
  • UNIQUE puede proteger una columna o una combinación de columnas.
  • CHECK rechaza condiciones falsas; añade NOT NULL cuando también deban rechazarse las desconocidas.
  • Los errores de restricción identifican datos que necesitan corregirse.

2.2 Identifica filas mediante claves primarias e identificadores generados

Una clave primaria identifica una fila de forma fiable. Puede ser una columna o una combinación, pero una tabla tiene como máximo una clave primaria. La clave debe ser única y estar presente, de modo que otras sentencias puedan identificar una fila sin depender de su descripción.

Elige un identificador estable

Una clave natural es un identificador existente del mundo real, como el ISBN de un libro. Una clave sustituta es un identificador artificial, a menudo un entero generado. El correo de un cliente puede cambiar; un identificador de cliente generado puede mantenerse igual mientras eso ocurre.

Una clave compuesta identifica una combinación:

PRIMARY KEY (order_id, product_id)

Un pedido puede contener varios productos y un producto puede aparecer en varios pedidos. El par identifica una línea de pedido. Ninguna de las columnas necesita ser única por sí sola.

PostgreSQL, MySQL y SQL Server exigen claves primarias sin valores ausentes. Las tablas normales de SQLite conservan una excepción histórica: una clave primaria distinta de INTEGER PRIMARY KEY puede contener NULL. Utiliza code TEXT PRIMARY KEY NOT NULL para una clave de texto. Las tablas STRICT de SQLite también cierran esta brecha.

Deja que la base de datos genere el número
Base de datosDeclaración de clave primaria generada
SQLiteid INTEGER PRIMARY KEY
PostgreSQLid INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY
MySQLid INT AUTO_INCREMENT PRIMARY KEY
SQL Serverid INT IDENTITY(1, 1) PRIMARY KEY

Omite id de la lista de columnas de la inserción para solicitar un valor generado. Un simple INTEGER PRIMARY KEY de PostgreSQL no lo genera. El código antiguo de PostgreSQL suele utilizar SERIAL.

En SQLite, INTEGER PRIMARY KEY es un alias del número interno de fila. Empieza con los identificadores generados 1, 2 y 3, y después elimina 3. El siguiente identificador generado normal vuelve a ser 3, uno más que el máximo actual. Con INTEGER PRIMARY KEY AUTOINCREMENT, es 4: no se reutiliza un número que haya tenido una fila confirmada. Un número de una inserción revertida sí puede reutilizarse. Esta garantía más fuerte requiere trabajo adicional, así que elígela cuando sea importante no reutilizar números.

Lee los identificadores sin tratarlos como recuentos

Los huecos son normales. Las eliminaciones los dejan, y PostgreSQL no devuelve los números a la secuencia tras inserciones fallidas o revertidas. Utiliza COUNT(*) para contar filas y una marca de tiempo para el momento de un suceso. El mayor identificador no responde de forma fiable a ninguna de esas preguntas.

La forma GENERATED ALWAYS de PostgreSQL normalmente rechaza un identificador explícito como 50. GENERATED BY DEFAULT y SERIAL aceptan valores explícitos, pero proporcionar 50 no hace avanzar el generador más allá de 50. Un valor generado posteriormente puede entrar en conflicto con él.

Para utilizar la clave de una fila nueva en una fila relacionada, recupera la clave:

INSERT INTO customers (first_name, last_name, email)
VALUES ('Dev', 'Patel', 'dev@example.com')
RETURNING id;

RETURNING funciona en PostgreSQL y SQLite 3.35.0 y posteriores. SQLite también ofrece last_insert_rowid(), MySQL ofrece LAST_INSERT_ID() y SQL Server utiliza OUTPUT. Lee el resultado de la inserción en lugar de adivinar el siguiente identificador.

Puntos clave

  • Una clave primaria identifica una fila; una clave compuesta identifica una combinación.
  • Las claves generadas utilizan declaraciones distintas en las distintas bases de datos.
  • AUTOINCREMENT de SQLite impide reutilizar identificadores confirmados, con un coste adicional.
  • Los huecos entre identificadores son normales; utiliza COUNT(*) para contar filas.
  • RETURNING obtiene la clave realmente generada.

2.3 Vincula tablas mediante claves foráneas

El customer_id de un pedido debe apuntar a un cliente que exista. Una clave foránea hace que la base de datos compruebe ese vínculo. La tabla que contiene la referencia es la hija; la tabla a la que apunta es la padre.

Declara y aplica el vínculo
CREATE TABLE orders (
  id INTEGER PRIMARY KEY,
  customer_id INTEGER NOT NULL REFERENCES customers(id)
);

Aquí customers debe existir primero y su id debe ser una clave primaria o única. Haz coincidir los tipos de ambos lados. La forma de tabla, FOREIGN KEY (customer_id) REFERENCES customers(id), declara el mismo vínculo por separado de la columna.

Con la aplicación de las restricciones activada, un pedido para el cliente 99 falla si no existe el cliente 99. Actualizar un pedido para asignarlo a ese cliente inexistente también falla. Una clave foránea que admita nulos puede contener NULL, que significa que no hay una fila vinculada; NOT NULL hace obligatorio el vínculo.

En SQLite, ejecuta PRAGMA foreign_keys = ON; en cada conexión nueva antes de iniciar una transacción. Un cambio de configuración dentro de una transacción no tiene efecto. PostgreSQL y SQL Server aplican las restricciones de clave foránea normalmente, al igual que el motor predeterminado de MySQL, InnoDB.

Predice la eliminación de una fila padre

Utiliza los clientes 1, Ana, y 2, Ben. Los pedidos 101 y 102 pertenecen a Ana; 103 pertenece a Ben. Considera la eliminación del cliente 1 con distintas declaraciones:

Acción ON DELETEResultado
NO ACTION o RESTRICTLa eliminación falla mientras 101 y 102 hagan referencia a Ana.
CASCADESe eliminan Ana, 101 y 102; se conservan Ben y 103.
SET NULLSe elimina a Ana; se conservan todos los pedidos, con 101 y 102 desvinculados.
SET DEFAULTLos valores que hacen referencia toman su valor predeterminado declarado.

SET NULL necesita una columna que admita nulos. SET DEFAULT sigue teniendo que cumplir la clave foránea: un valor predeterminado no ausente debe identificar una fila padre existente. Un valor predeterminado NULL funciona cuando se permiten vínculos ausentes.

Elige según el significado de los datos. Las líneas de pedido suelen pertenecer por completo a su pedido, por lo que la cascada puede ser adecuada. Los pedidos que deben conservarse requieren una acción de bloqueo cuando alguien intenta eliminar a su cliente. Un vínculo opcional con un proveedor puede establecerse en NULL. Aplicar cascadas en todas partes permite que una eliminación borre más registros de lo que sugiere el nombre de su tabla.

Trabaja en orden de dependencias

Crea las tablas padre antes que las hijas e inserta las filas padre antes que las filas que hacen referencia a ellas. Al eliminar datos o tablas relacionados, trabaja de hijas a padres. Una acción ON UPDATE ofrece las mismas opciones cuando cambia la clave de la fila padre; ON UPDATE CASCADE copia la clave nueva a las hijas.

RESTRICT comprueba de inmediato. NO ACTION, la opción predeterminada, puede esperar hasta el final de la sentencia o, con una restricción diferible, hasta el final de la transacción. Ambas bloquean una eliminación normal que dejaría referencias sin correspondencia. Mantén estables los identificadores generados para que cambiar los datos de un cliente no obligue a cambiar todas las referencias a ese cliente.

Puntos clave

  • Una clave foránea vincula valores de la tabla hija con una clave primaria o única existente de la tabla padre.
  • NULL permite un vínculo opcional salvo que NOT NULL lo prohíba.
  • CASCADE elimina las filas hijas; SET NULL las conserva sin su vínculo.
  • Activa las claves foráneas de SQLite antes de BEGIN en cada conexión.
  • Crea e inserta primero las tablas y filas padre; elimina primero las filas y tablas hijas.
  • Elige las acciones según los registros que deban conservarse.
3

Añade filas con INSERT

Añadir filas significa asignar cada valor a la columna correcta y dejar que la base de datos compruebe el resultado. Se puede introducir un producto directamente, añadir varios clientes juntos y copiar pedidos antiguos desde una consulta. También recuperarás una clave generada y elegirás cómo gestionar un SKU existente. La misma entrada puede representar unas existencias de sustitución o una entrega adicional, por lo que una inserción o actualización debe expresar con precisión el cambio previsto.

3.1 Inserta filas con VALUES

INSERT añade filas a una tabla existente. Su lista de columnas establece la correspondencia entre los valores que proporcionas y los campos que los reciben. Escribe esa correspondencia de forma explícita para que un cambio posterior en la tabla no altere sin avisar el significado de tus datos de entrada.

Asigna los valores por posición
INSERT INTO products (sku, name, price, in_stock)
VALUES ('LAMP-01', 'Desk lamp', 24.99, 12);

Lee los pares en orden: SKU recibe 'LAMP-01', el nombre recibe 'Desk lamp', el precio recibe 24,99 y las existencias reciben 12. Debe haber cuatro valores para estas cuatro columnas. Una discrepancia, como dos valores para tres columnas, provoca un error.

Sin la lista, los valores siguen el orden de columnas declarado en la tabla. SQLite exige proporcionar todas las columnas; PostgreSQL permite menos y asigna valores predeterminados a las columnas finales. Una lista explícita evita depender de cualquiera de estos comportamientos. También te permite colocar las columnas en un orden claro para los datos de entrada.

Un par intercambiado puede ser peor que un error de sintaxis. Proporcionar 9,99 como nombre y 'Desk lamp' como precio hace que PostgreSQL rechace el precio no numérico. La afinidad normal de SQLite puede almacenar el texto del nombre «9.99» y el texto del precio «Desk lamp» sin dar error. Vuelve a leer la fila insertada con SELECT para comprobar la correspondencia.

Escribe correctamente los valores literales
ClaseEjemplo SQL
Texto'Desk lamp'
Texto que contiene un apóstrofo'O''Brien'
Número1250.50
Fecha ISO'2026-03-15'
Valor ausenteNULL

El apóstrofo duplicado almacena un solo apóstrofo. Los números no llevan símbolos monetarios ni separadores de millares; una coma separa valores, por lo que una coma dentro de un importe sin comillas cambia el número de valores. 'NULL' es el texto de cuatro letras «NULL», no un valor ausente.

Deja que los campos omitidos se rellenen solos

Una columna omitida recibe su valor predeterminado, o NULL si no tiene ninguno. Una clave generada recibe un valor generado. Este último comportamiento depende de la declaración: INTEGER PRIMARY KEY de SQLite genera identificadores; PostgreSQL requiere una declaración de identidad para este fin. Una clave primaria entera simple de PostgreSQL omitida de una inserción provoca un error porque su valor sería NULL.

PostgreSQL, MySQL y SQL Server permiten DEFAULT como marcador de valor. SQLite no lo acepta dentro de una lista VALUES; omite esa columna en su lugar. Un NULL explícito nunca solicita el valor predeterminado.

Añade varias filas juntas
INSERT INTO customers (first_name, last_name, email) VALUES
  ('Ana', 'Ruiz', 'ana@example.com'),
  ('Ben', 'Okafor', 'ben@example.com'),
  ('Chloe', 'Nguyen', 'chloe@example.com');

En una tabla vacía cuya clave generada empieza en 1, reciben los identificadores 1, 2 y 3. Con la gestión normal de restricciones, la sentencia de varias filas se ejecuta correctamente en su conjunto o falla en su conjunto. Si una fila infringe una regla, no se inserta ninguna de las filas de esta sentencia.

Un error UNIQUE señala una clave o valor duplicado; NOT NULL señala datos ausentes; CHECK señala una condición incumplida; y un error de clave foránea señala un vínculo no válido. Corrige el valor o la correspondencia prevista antes de volver a intentarlo.

Puntos clave

  • Enumera las columnas y asigna cada valor a ellas por posición.
  • Los campos omitidos reciben valores predeterminados o NULL; los identificadores generados requieren un generador.
  • Utiliza comillas simples para el texto y duplica los apóstrofos incluidos en él.
  • NULL y el texto NULL son distintos.
  • Una inserción normal de varias filas falla en su conjunto si una fila infringe una restricción.

3.2 Inserta datos desde consultas, obtén las nuevas claves y gestiona los duplicados

No es necesario escribir las filas de una en una. Una consulta puede proporcionar las filas de una inserción, y una regla de conflicto puede indicar qué debe ocurrir cuando un valor único ya existe. Ambas funciones dependen de seleccionar con precisión los datos previstos.

Copia el resultado de una consulta
INSERT INTO archived_orders (id, customer_id, order_date, total)
SELECT id, customer_id, order_date, total
FROM orders
WHERE order_date < '2026-01-01';

No hay cláusula VALUES: la consulta proporciona los valores. Haz corresponder sus columnas seleccionadas con la lista de destino por posición. La tabla de destino debe existir y sus reglas siguen aplicándose.

Revisa primero el SELECT por separado. Los pedidos 201, 202 y 204 tienen las fechas 2025-11-03, 2025-12-19 y 2025-10-30 y los totales 45,00, 120,50 y 60,00. Los pedidos 203 y 205 tienen fechas de 2026. La consulta devuelve tres filas que suman 225,50 y la inserción copia esas tres. También puede copiar cero filas cuando el filtro no encuentra nada.

Una segunda ejecución intenta copiarlas de nuevo. Una clave primaria en el destino hace que eso falle en lugar de almacenar duplicados sin avisar. INSERT ... SELECT es una operación de copia; no elimina las filas de origen ni mantiene sincronizadas las dos tablas.

Las importaciones de archivos suelen pasar primero por una tabla de preparación. La consola de SQLite utiliza .import --csv file.csv staging; psql utiliza \copy. En una consulta posterior, TRIM(email) elimina los espacios de los extremos y NULLIF(TRIM(email), '') convierte un correo vacío o compuesto solo por espacios en NULL. Las restricciones de destino comprueban entonces las filas limpias.

Lee el resultado de una escritura
INSERT INTO customers (first_name, last_name, email)
VALUES ('Dev', 'Patel', 'dev@example.com')
RETURNING id;

El resultado proporciona el identificador de cliente generado para utilizarlo en una fila relacionada. PostgreSQL y SQLite 3.35.0 y posteriores admiten RETURNING en inserciones, actualizaciones y eliminaciones. MySQL utiliza LAST_INSERT_ID() para un identificador generado; SQL Server utiliza OUTPUT.

Decide cómo gestionar los duplicados

Con stock (sku TEXT PRIMARY KEY, qty INTEGER NOT NULL), supón que 'LAMP-01' tiene una cantidad de 12. Una inserción simple que propone el mismo SKU y una cantidad de 20 falla. En SQLite y PostgreSQL:

INSERT INTO stock (sku, qty) VALUES ('LAMP-01', 20)
ON CONFLICT (sku) DO UPDATE
SET qty = stock.qty + excluded.qty;

stock.qty es el 12 existente. excluded.qty es el 20 propuesto. Esta forma almacena 32, lo que corresponde a una entrega adicional. SET qty = excluded.qty almacena 20, lo que corresponde a un recuento de sustitución. DO NOTHING conserva 12 y omite la fila en conflicto. Cada variante parte de la misma cantidad original de 12.

Una inserción o actualización combina insertar una fila nueva con actualizar cuando hay un conflicto. El destino del conflicto debe tener una protección de unicidad adecuada. La familia equivalente de MySQL es ON DUPLICATE KEY UPDATE. Un INSERT simple no corrige un cliente existente: crea otra fila o provoca un error de unicidad. Utiliza UPDATE para una fila que sabes que existe y una inserción o actualización cuando la fila podría existir ya.

Puntos clave

  • INSERT ... SELECT copia los resultados de la consulta en una tabla existente.
  • Volver a ejecutar una copia requiere una política de duplicados deliberada.
  • RETURNING devuelve valores de las filas realmente escritas.
  • excluded identifica la fila propuesta en una inserción o actualización.
  • Sustituye las existencias con excluded.qty; añade una entrega con stock.qty + excluded.qty.
  • DO NOTHING omite un conflicto de unicidad sin actualizar la fila existente.
4

Modifica y elimina filas con UPDATE y DELETE

Una sentencia válida que modifica datos puede afectar a las filas equivocadas. Actualizar un precio, eliminar un pedido y seleccionar los registros que se van a modificar son decisiones distintas. Calcularás valores nuevos a partir de los almacenados, distinguirás entre vaciar un campo y eliminar una fila, y construirás condiciones con fechas, valores ausentes y alternativas agrupadas. Una vista previa y la comprobación del resultado permiten ver el efecto antes de que una transacción haga permanente el cambio.

4.1 Modifica valores con UPDATE

UPDATE modifica valores de filas que ya existen. Indica una tabla, asigna valores nuevos con SET y después elige las filas de destino con WHERE. Las restricciones de la tabla comprueban los valores resultantes.

Asigna valores a uno o varios campos
UPDATE products
SET price = 22.50, in_stock = 30
WHERE id = 3;

El producto con clave 3 recibe ambos valores; las demás filas conservan los suyos. Las asignaciones utilizan comas. Escribir SET price = 22.50 AND in_stock = 30 no significa hacer dos asignaciones. PostgreSQL lo rechaza; SQLite trata el lado derecho como una expresión booleana y puede almacenar 0 o 1 en el precio.

Omitir WHERE es SQL válido y aplica el cambio a todas las filas. UPDATE products SET price = 0; establece el precio de todos los productos en cero si las reglas de la tabla lo permiten. Una vista previa con la condición prevista muestra si el destino es una fila, varias o ninguna.

Calcula a partir del valor almacenado
UPDATE products
SET price = price * 1.10;

Un precio de 20,00 pasa a ser 22,00 tras un aumento del 10 %. Un precio de 19,99 da un resultado sin redondear de 21,989. PostgreSQL almacena 21,99 en una columna NUMERIC(8, 2). SQLite no exige la escala, por lo que SET price = ROUND(price * 1.10, 2) solicita dos decimales. Para almacenar dinero con exactitud en SQLite, conserva céntimos enteros y haz explícita la decisión de redondeo de los céntimos.

La expresión debe incluir el valor anterior cuando el cambio es relativo. SET in_stock = in_stock - 1 resta una unidad; SET in_stock = 1 sustituye el recuento por uno.

En SQLite y PostgreSQL, todas las expresiones del lado derecho leen la fila anterior a la actualización. UPDATE t SET a = b, b = a; intercambia los valores de una fila de 1 y 2 a 2 y 1. La actualización de una sola tabla de MySQL evalúa las asignaciones de izquierda a derecha, por lo que la misma forma deja ambos en 2. No traslades esta suposición de un sistema a otro.

Ten presentes las reglas y los valores ausentes

Utiliza SET phone = NULL para vaciar un campo de teléfono. Para encontrar valores de teléfono ausentes, utiliza WHERE phone IS NULL. La igualdad con NULL no los encuentra.

Considera los precios 12,00, 3,00 y 8,50 protegidos por CHECK (price > 0). Restar 5 a todos los precios haría que el segundo fuera -2,00. Con la gestión normal de restricciones, ese fallo deshace toda la sentencia, por lo que incluso los precios que serían válidos se mantienen sin cambios.

Una actualización de clave primaria también debe cumplir las claves foráneas relacionadas. Un cambio de clave bloqueado falla mientras las filas hijas apunten a la clave anterior; ON UPDATE CASCADE les transmite el nuevo valor. Mantener estables los identificadores generados evita este trabajo adicional cuando cambian los datos descriptivos.

Interpreta el número de filas afectadas

psql informa de un resultado como UPDATE 3; changes() de SQLite informa del recuento de la última sentencia de cambio. Ambos incluyen las filas seleccionadas y actualizadas aunque el valor asignado sea igual al anterior. Un recuento de tres no garantiza tres valores visiblemente distintos. Compara el recuento con la vista previa e inspecciona después los campos relevantes, o utiliza RETURNING para ver directamente las filas afectadas.

Puntos clave

  • SET asigna valores; WHERE elige filas.
  • Separa las asignaciones con comas, no con AND.
  • Utiliza el valor anterior de la columna en un cálculo relativo.
  • Un fallo normal de restricción deshace toda la sentencia UPDATE.
  • Los recuentos de filas afectadas pueden incluir filas cuyos valores siguieron siendo iguales.

4.2 Elimina filas con DELETE

DELETE elimina filas completas. Deja la tabla preparada para volver a contener filas. Para vaciar un campo se utiliza UPDATE ... SET column = NULL; DELETE email FROM customers no es SQL válido.

Sigue una eliminación filtrada

La tienda tiene estos pedidos:

IDEstadoFecha del pedido
201cancelado2025-11-03
202enviado2025-12-19
203cancelado2026-01-08
204cancelado2025-10-30
205vencido2026-02-14
DELETE FROM orders
WHERE status = 'cancelled'
  AND order_date < '2026-01-01';

El pedido 201 cumple ambas pruebas, al igual que 204. El pedido 203 está cancelado, pero es demasiado reciente; 202 es suficientemente antiguo, pero está enviado. La sentencia elimina dos filas y conserva 202, 203 y 205. DELETE FROM orders; sin la condición eliminaría los cinco.

Utiliza datos relacionados para elegir filas
DELETE FROM order_items
WHERE order_id IN (
  SELECT id FROM orders WHERE status = 'cancelled'
);

La consulta interna produce los identificadores de los pedidos cancelados. IN comprueba el order_id de cada línea frente a esa lista. Ejecuta la consulta interna por separado para inspeccionar las claves y después revisa las filas de las líneas con la misma condición.

Las claves foráneas también afectan a la eliminación. Una fila padre con filas hijas que la referencian puede estar protegida por NO ACTION o RESTRICT; una cascada elimina las filas hijas; SET NULL las conserva, pero borra el vínculo. Comprueba esas acciones al valorar el efecto de eliminar una fila padre, porque la tabla nombrada directamente puede no ser la única que cambie.

Elige qué debe conservarse
SentenciaFilas eliminadasQué se conserva
DELETE ... WHERE ...Filas que cumplen la condiciónLa tabla y las demás filas
DELETE FROM orders;Todas las filasLa tabla vacía
TRUNCATE TABLE orders;Todas las filas, sin WHERELa tabla vacía
DROP TABLE orders;Todas las filas junto con la tablaNo queda la tabla orders

PostgreSQL, MySQL, SQL Server y Oracle admiten TRUNCATE; SQLite no. Sus reglas de transacciones y dependencias varían según la base de datos. Una sentencia que parece una operación de vaciado rápido también debe ajustarse a esas reglas.

Conserva el historial con una eliminación lógica
UPDATE customers
SET deleted_at = '2026-03-15'
WHERE id = 7;

Una eliminación lógica marca la fila sin borrarla. Puede conservar el historial y permitir la restauración borrando la marca. Las consultas de clientes activos deben incluir WHERE deleted_at IS NULL; de lo contrario, los clientes marcados siguen apareciendo. Marcar los datos no los borra.

Una eliminación confirmada no puede deshacerse con un ROLLBACK posterior. La restauración necesita una copia guardada o una copia de seguridad. Dentro de una transacción abierta, una reversión aún puede restaurar las filas eliminadas. Comprueba los identificadores seleccionados y el recuento de filas afectadas antes de hacer permanente el resultado.

Puntos clave

  • DELETE elimina filas; UPDATE puede vaciar un solo campo.
  • Omitir WHERE vacía la tabla y conserva su estructura.
  • IN puede seleccionar filas utilizando claves de otra tabla.
  • Las acciones de clave foránea pueden ampliar o bloquear una eliminación.
  • Una eliminación lógica requiere filtros de filas activas y no borra los datos almacenados.
  • ROLLBACK restaura una eliminación solo mientras su transacción siga sin confirmar.

4.3 Selecciona exactamente las filas que quieres modificar o eliminar

Elegir las filas suele ser la parte más difícil de un cambio. El mismo filtro que resulta inofensivo en una consulta puede eliminar o actualizar demasiado al reutilizarlo en una escritura. Convierte la regla prevista en una condición y después inspecciona qué filas selecciona realmente.

Revisa la condición exacta
SELECT id, status, order_date FROM orders
WHERE status = 'cancelled'
  AND order_date < '2026-01-01';

Esta vista previa devuelve los pedidos 201 y 204 en el ejemplo de la tienda con cinco pedidos. Reutiliza exactamente esa condición en la eliminación. Reescribirla al cambiar la orden crea una selección nueva sin comprobar.

Para una fila concreta, utiliza su clave primaria: WHERE id = 42 selecciona como máximo una fila. Un nombre descriptivo como 'Desk lamp' puede ser compartido por varios productos.

Agrupa las alternativas explícitamente

AND tiene mayor precedencia que OR. Compara:

WHERE status = 'cancelled'
   OR status = 'expired' AND order_date < '2026-01-01'

con:

WHERE (status = 'cancelled' OR status = 'expired')
  AND order_date < '2026-01-01'

La primera acepta todos los pedidos cancelados, con independencia de la fecha, más los pedidos vencidos anteriores a 2026. Selecciona 201, 203 y 204. La segunda aplica la prueba de fecha a ambos estados y selecciona 201 y 204. El pedido 203 muestra la diferencia porque está cancelado en 2026.

Incluye los valores ausentes de forma deliberada

WHERE customer_id = NULL no selecciona filas. Los valores ausentes necesitan IS NULL o IS NOT NULL. Una prueba negativa también tiene una omisión: status <> 'shipped' no incluye un estado ausente, porque su comparación es desconocida.

Si el estado ausente pertenece al grupo previsto, escribe:

WHERE status <> 'shipped' OR status IS NULL

Al añadir otra condición, agrupa toda esta alternativa con paréntesis para que ambas ramas cumplan esa condición.

La búsqueda por patrones puede abarcar más que la descripción prevista. LIKE '%lamp%' coincide con «Desk lamp» y «Clamp». El LIKE predeterminado de SQLite también ignora las mayúsculas y minúsculas de las letras inglesas, así que encuentra «Lamp shade». Un patrón es útil para encontrar posibles coincidencias, pero inspecciónalas antes de modificarlas.

Elige una comparación de listas para una lista
UPDATE orders SET status = 'on hold'
WHERE customer_id IN (
  SELECT id FROM customers WHERE state = 'CA'
);

La subconsulta puede proporcionar varios identificadores de cliente; IN comprueba la pertenencia. Sustituir IN por = solicita un único resultado escalar. PostgreSQL rechaza varias filas en ese caso, mientras que SQLite utiliza solo la primera fila devuelta sin avisar y omite a los demás clientes.

Después del cambio, compara el recuento de filas afectadas con la vista previa. PostgreSQL y SQLite también permiten añadir RETURNING * para mostrar las filas afectadas. Para una escritura arriesgada, inicia una transacción antes de modificar los datos, inspecciona el resultado y después elige COMMIT o ROLLBACK.

Puntos clave

  • Revisa exactamente la condición WHERE que utilizará la escritura.
  • Un filtro de clave primaria identifica como máximo una fila.
  • Los paréntesis hacen que las alternativas OR compartan una condición AND.
  • IS NULL gestiona los valores ausentes; las comparaciones normales los omiten.
  • IN acepta una lista de una subconsulta; la igualdad escalar no.
  • Comprueba el recuento y el resultado antes de confirmar.
5

Agrupa cambios en transacciones

Algunos cambios deben ir juntos: una transferencia necesita tanto un cargo como un abono. Las transacciones permiten tomar una sola decisión de conservar o deshacer esas sentencias, mientras que los puntos de guardado permiten volver a un punto intermedio. Seguirás los saldos a través de cambios correctos y errores, y después compararás cómo gestionan SQLite y PostgreSQL una sentencia fallida. La base de datos y la configuración del cliente importan, especialmente cuando un cambio de estructura puede confirmar trabajo anterior.

5.1 Confirma o revierte un grupo de cambios

Una transacción agrupa sentencias relacionadas en una unidad de trabajo. Decides conservar sus cambios juntos con COMMIT o deshacerlos juntos con ROLLBACK. La propiedad de todo o nada se llama atomicidad, la A de ACID.

Conserva ambos lados de una transferencia

La cuenta de Maya, con identificador 1, tiene 500,00. La cuenta de Leo, con identificador 2, tiene 120,00. Transferir 75,00 requiere dos cambios:

BEGIN;
UPDATE accounts SET balance = balance - 75.00 WHERE id = 1;
UPDATE accounts SET balance = balance + 75.00 WHERE id = 2;
SELECT id, balance FROM accounts WHERE id IN (1, 2);
COMMIT;

La primera actualización deja a Maya con 425,00. La segunda deja a Leo con 195,00. La comprobación muestra ambos saldos antes de confirmar y el total se mantiene en 620,00. Para estos saldos decimales exactos, utiliza NUMERIC de PostgreSQL; en SQLite, una versión con importes monetarios exactos almacena 50 000 y 12 000 céntimos y transfiere 7500 céntimos.

Sin una transacción explícita y con confirmación automática, la primera actualización podría hacerse permanente antes de que se ejecute la segunda. Un fallo entre ambas conservaría el cargo sin el abono. Una transacción da a las dos actualizaciones una sola decisión final de conservar o deshacer. Si falla una sentencia, gestiona el error antes de decidir que la transferencia está completa.

Comprende el límite predeterminado

Con la confirmación automática de la base de datos, cada sentencia independiente que se ejecuta correctamente se confirma como su propia transacción. Este es el comportamiento inicial habitual de SQLite, PostgreSQL, MySQL y SQL Server. Una biblioteca de programación o un cliente pueden elegir otra configuración e iniciar una transacción por ti.

BEGIN; inicia una transacción explícita en SQLite y PostgreSQL. SQLite y SQL Server también utilizan BEGIN TRANSACTION; PostgreSQL y MySQL aceptan START TRANSACTION. Oracle inicia una transacción con un cambio de datos y normalmente espera a COMMIT en herramientas como SQL*Plus, salvo que esté activada la confirmación automática.

COMMIT termina la transacción y conserva sus cambios. ROLLBACK la termina y deshace sus cambios sin confirmar. Una reversión posterior no puede traspasar una confirmación anterior.

Inspecciona y deshaz
BEGIN;
DELETE FROM orders;
SELECT * FROM orders;
ROLLBACK;

Tu conexión ve una tabla vacía en el SELECT y vuelve a ver los cinco pedidos después de la reversión. El resultado vacío era real dentro de la transacción, pero aún no era permanente. Las demás conexiones normalmente no ven los cambios sin confirmar.

Una transacción solo puede protegerte de una selección de filas equivocada si inspeccionas y decides deshacerla. SQL puede actualizar correctamente una fila no deseada: ninguna regla de la base de datos sabe qué cuenta querías indicar. Compara los identificadores, valores y recuentos devueltos con el resultado previsto antes de confirmar.

Mantén las transacciones breves y finalízalas. Las transacciones abiertas pueden mantener bloqueos que hacen esperar a otras conexiones; SQLite solo permite un escritor a la vez. Cerrar una conexión con una transacción sin terminar revierte sus cambios pendientes. Cuando una biblioteca inicia una transacción automáticamente, el programa debe invocar su método de confirmación para conservar el trabajo.

Puntos clave

  • La atomicidad permite conservar o deshacer juntos los cambios relacionados.
  • La confirmación automática hace permanente una sentencia independiente ejecutada correctamente.
  • Tu conexión puede inspeccionar sus propios cambios pendientes.
  • Tanto COMMIT como ROLLBACK finalizan la transacción.
  • ROLLBACK no puede deshacer trabajo de una transacción anterior confirmada.

5.2 Gestiona errores, puntos de guardado y cambios de estructura en una transacción

Una sentencia fallida no tiene el mismo efecto en todas las bases de datos. Debes saber qué sigue pendiente antes de decidir cómo recuperarte. Un punto de guardado puede ofrecer un punto de retorno más cercano dentro de una transacción abierta.

Sigue un error

Después de la transferencia, Maya tiene 425,00 y Leo tiene 195,00. La tabla tiene CHECK (balance >= 0). Inicia una transacción y resta 30,00 a Maya: su saldo pendiente es 395,00. Después intenta restar 300,00 a Leo. Eso dejaría su saldo en -105,00, por lo que la segunda sentencia falla.

Base de datosEstado tras el error normal de restricción
SQLiteSe deshace la sentencia fallida; el cambio anterior de Maya sigue pendiente.
PostgreSQLLa transacción está fallida y se rechazan las órdenes normales posteriores.

En SQLite, confirmar en este punto conservaría solo el cargo de Maya. En PostgreSQL, COMMIT sobre la transacción fallida la termina con una reversión. Un procedimiento claro de recuperación es ejecutar ROLLBACK, corregir la causa y volver a ejecutar las sentencias relacionadas. Ambos saldos vuelven entonces a 425,00 y 195,00 antes del intento corregido.

Deshaz una parte posterior con un punto de guardado
BEGIN;
UPDATE accounts SET balance = balance + 10 WHERE id = 1;
SAVEPOINT after_first;
UPDATE accounts SET balance = balance + 10 WHERE id = 2;
ROLLBACK TO after_first;
COMMIT;

El punto de guardado va después del aumento de Maya. ROLLBACK TO deshace el aumento posterior de Leo, pero conserva el de Maya. Los saldos finales son 435,00 y 195,00. No termina la transacción exterior; eso lo hace COMMIT.

RELEASE after_first elimina el punto de guardado sin deshacer los cambios posteriores. No es una confirmación permanente independiente dentro de la transacción exterior. PostgreSQL también permite que ROLLBACK TO sobre un punto de guardado establecido antes de un error elimine el estado fallido y continúe desde ese punto.

Comprueba si los cambios de estructura pueden revertirse

SQLite y PostgreSQL permiten CREATE TABLE, ALTER TABLE y DROP TABLE dentro de transacciones. Por ejemplo, BEGIN; DROP TABLE orders; ROLLBACK; restaura la tabla y sus filas.

El DDL normal sobre tablas permanentes en MySQL y Oracle provoca confirmaciones implícitas. Un CREATE TABLE, ALTER TABLE, DROP TABLE o TRUNCATE TABLE puede confirmar cambios anteriores pendientes además de realizar su propia operación estructural. Una reversión posterior no puede deshacer ese trabajo anterior. No supongas que una transacción que engloba un script hace que todos los dialectos de bases de datos se comporten igual.

Para un cambio de datos arriesgado, inicia la transacción, ejecuta la escritura, inspecciona sus valores y su recuento y después confirma o revierte. Por ejemplo, inspecciona los precios de iluminación después de UPDATE products SET price = ROUND(price * 1.10, 2) WHERE category = 'lighting';. Toma la decisión pronto para que la transacción no mantenga otros trabajos en espera.

Puntos clave

  • Un error normal de restricción en SQLite deja pendientes los cambios anteriores de la transacción.
  • Un error de PostgreSQL deja la transacción fallida hasta una reversión o recuperación a un punto de guardado.
  • ROLLBACK TO deshace el trabajo posterior sin terminar la transacción.
  • RELEASE elimina un punto de guardado sin confirmar la transacción exterior.
  • La posibilidad de revertir DDL depende de la base de datos.
6

Modifica la estructura de las tablas con ALTER TABLE y DROP TABLE

A veces las tablas necesitan un campo nuevo, un nombre más claro o una regla más estricta cuando ya contienen datos. Modificar esa estructura requiere comprobar las filas existentes y los objetos que dependen de la tabla. Añadirás y rellenarás columnas, reconocerás cuándo SQLite necesita una reconstrucción y distinguirás entre eliminar registros y eliminar su contenedor. Las dependencias también establecen el orden de trabajo al retirar tablas relacionadas.

6.1 Añade, renombra y elimina columnas con ALTER TABLE

ALTER TABLE modifica la estructura de una tabla existente y conserva sus filas. UPDATE modifica los valores que contienen esas filas. Añadir un campo de descuento requiere ALTER TABLE; aumentar los descuentos ya almacenados requiere UPDATE.

Añade y renombra campos
ALTER TABLE customers ADD COLUMN phone TEXT;
ALTER TABLE customers RENAME COLUMN phone TO mobile;
ALTER TABLE customers RENAME TO clients;

SQLite y PostgreSQL comparten estas formas. Una columna nueva asigna a las filas existentes su valor predeterminado, o NULL cuando no tiene ninguno. ADD COLUMN active INTEGER NOT NULL DEFAULT 1 asigna a cada fila actual un valor activo de 1. Añadir email TEXT NOT NULL sin valor predeterminado falla en una tabla con datos porque las filas existentes carecerían de un valor obligatorio.

SQLite admite RENAME COLUMN desde la versión 3.25.0 y DROP COLUMN desde la 3.35.0. Al renombrar, actualiza el código de la aplicación y las consultas guardadas que hagan referencia al nombre anterior. El SQL externo a la base de datos no puede descubrir automáticamente el nombre nuevo.

Rellena los datos antes de exigirlos

En PostgreSQL, añade una columna que admita nulos, rellena las filas existentes con valores adecuados y solo entonces hazla obligatoria:

ALTER TABLE customers ADD COLUMN email TEXT;
UPDATE customers SET email = 'unknown@example.com'
WHERE email IS NULL;
ALTER TABLE customers ALTER COLUMN email SET NOT NULL;

Esto ilustra cómo rellenar un campo obligatorio; no declara el correo como único. Una columna real de correo único necesita valores válidos distintos. SET NOT NULL falla si quedan valores ausentes. PostgreSQL también permite modificar un tipo con ALTER COLUMN price TYPE NUMERIC(10, 2), establecer un valor predeterminado y añadir una comprobación con nombre. Las filas existentes deben cumplir cualquier regla nueva.

Elimina un campo o reconstruye una tabla

ALTER TABLE customers DROP COLUMN mobile; elimina el campo y todos sus valores almacenados. Las dependencias pueden bloquear la operación. SQLite rechaza eliminar una columna de clave primaria, única, indexada o de clave foránea, o una utilizada por otro objeto del esquema. PostgreSQL puede eliminar objetos dependientes con CASCADE, incluida una vista que utilice la columna.

SQLite no puede modificar el tipo de una columna existente ni añadir restricciones de clave primaria, unicidad, clave foránea o comprobación a columnas existentes con un simple ALTER. La versión 3.53.0 añade ALTER COLUMN ... SET NOT NULL y DROP NOT NULL, pero no la edición general de restricciones. Una columna recién añadida puede tener una comprobación o una referencia permitida, pero no puede tener PRIMARY KEY ni UNIQUE; con las claves foráneas activadas, una referencia añadida necesita un valor predeterminado NULL.

Para un cambio más amplio en SQLite:

  1. Registra los índices, disparadores y vistas que deben volver a crearse. Si las claves foráneas están activadas, desactívalas antes de la transacción.
  2. Inicia una transacción y crea una tabla nueva con las reglas deseadas.
  3. Copia las filas utilizando columnas explícitas en INSERT INTO new_products (...) SELECT ... FROM products;.
  4. Elimina la tabla anterior y renombra la nueva como products.
  5. Vuelve a crear los objetos dependientes y ejecuta PRAGMA foreign_key_check;. Resuelve cualquier problema indicado antes de confirmar.
  6. Confirma y restablece después la aplicación de las restricciones de clave foránea si estaba activada antes.

MySQL modifica las definiciones con MODIFY COLUMN; SQL Server utiliza ALTER COLUMN. Expresa un cambio estructural con la sintaxis admitida por la base de datos de destino antes de ejecutarlo.

Puntos clave

  • ALTER TABLE modifica la estructura; UPDATE modifica los valores almacenados.
  • Las columnas añadidas asignan a las filas existentes un valor predeterminado o NULL.
  • Rellena una columna nueva obligatoria antes de añadir NOT NULL.
  • Eliminar una columna borra sus valores y puede quedar bloqueado por dependencias.
  • SQLite necesita una reconstrucción para muchos cambios de tipos y restricciones.
  • Las reconstrucciones deben conservar los objetos dependientes y comprobar las claves foráneas.

6.2 Elimina tablas con DROP TABLE

DROP TABLE elimina tanto el contenedor como su contenido. Después de DROP TABLE archived_orders;, las consultas no pueden leer esa tabla porque ya no existe. Sus restricciones, índices y disparadores se eliminan con ella.

Elige el nivel de eliminación
Resultado previstoSentencia
Conservar la tabla y eliminar las filas seleccionadasDELETE FROM orders WHERE ...;
Conservar una tabla vacíaDELETE FROM orders;
Vaciar rápidamente una tabla donde se admitaTRUNCATE TABLE orders;
Eliminar la propia tablaDROP TABLE orders;

DROP TABLE IF EXISTS archived_orders; evita un error si la tabla no existe. Aun así, elimina una tabla existente y sus datos. Un script de preparación que elimina y vuelve a crear tablas es destructivo cuando se ejecuta en una base de datos con registros que quieres conservar.

Respeta los vínculos entre tablas

Elimina las tablas hijas antes que las padre, invirtiendo el orden habitual de creación. En PostgreSQL, eliminar customers mientras una clave foránea de pedidos depende de ella falla. DROP TABLE customers CASCADE; también elimina la clave foránea dependiente y las vistas dependientes. La tabla de pedidos y sus filas se conservan, pero la relación con los clientes deja de exigirse.

Este CASCADE de PostgreSQL es distinto del ON DELETE CASCADE de una clave foránea. El primero elimina objetos dependientes de la base de datos durante un cambio de estructura. El segundo elimina filas hijas cuando se elimina una fila padre. Saber qué acción se utiliza evita una predicción incorrecta sobre los datos que se conservan.

Con la aplicación de las restricciones de clave foránea de SQLite activada, eliminar una tabla realiza primero una eliminación implícita de sus filas. Las filas hijas que las referencian pueden bloquearla. Si la relación declara ON DELETE CASCADE, esas filas hijas pueden eliminarse; SET NULL puede borrar sus vínculos. Por tanto, eliminar una tabla requiere prestar la misma atención a las referencias que eliminar filas, además de atender a la estructura de tabla que se elimina.

Conserva una vía de recuperación

Antes de eliminar o reconstruir una tabla con datos reales, conserva una copia utilizable. Una copia interna rápida de los datos es:

CREATE TABLE products_backup AS
SELECT * FROM products;

En SQLite y PostgreSQL, esto conserva los datos seleccionados, pero no las restricciones originales. No constituye una reconstrucción completa de la definición de la tabla. Una exportación o una copia de seguridad de la base de datos conserva los datos de recuperación fuera de la tabla que se modifica.

SQLite y PostgreSQL también permiten probar una eliminación de tabla dentro de una transacción:

BEGIN;
DROP TABLE archived_orders;
ROLLBACK;

La reversión restaura la tabla y sus filas porque la eliminación no se confirmó. Una vez confirmada, no puede revertirse ejecutando ROLLBACK después. En las bases de datos con confirmaciones implícitas de DDL, envolver la eliminación en sintaxis de transacción no proporciona esta posibilidad de deshacer. Inspecciona la base de datos de destino y las tablas implicadas antes de ejecutar un script de reconstrucción.

Puntos clave

  • DROP TABLE elimina la tabla y sus filas, restricciones, índices y disparadores.
  • IF EXISTS suprime el error por ausencia, no la eliminación de una tabla existente.
  • Elimina las tablas hijas antes que sus tablas padre.
  • DROP CASCADE de PostgreSQL elimina objetos dependientes, mientras que las tablas hijas pueden conservarse.
  • Una copia de solo datos no conserva las restricciones originales.

Ejemplos de Crear y modificar tablas de base de datos

6 Lecciones Interactivas

1

Crea e inspecciona una tabla de productos

11 pasos
Define una tabla vacía, comprueba sus columnas y elige un almacenamiento adecuado para cada valor.
  1. 1
    IntroducciónEmpieza con un producto

    Una tienda necesita registrar el identificador, nombre, precio y cantidad en existencias de un producto. La definición de una tabla asigna un campo a cada dato antes de añadir filas de productos.

    Crearemos la estructura, la inspeccionaremos y después comprobaremos si los tipos conservan el significado de los valores. Los ejemplos utilizan SQLite e indican los cambios de PostgreSQL cuando afectan al resultado.

  2. 2
    ExplicaciónLee una definición de columna

    En name TEXT NOT NULL, name es el identificador del campo, TEXT describe su almacenamiento y NOT NULL exige un valor.

    La tabla enumera estas definiciones entre paréntesis, separadas por comas. El punto y coma termina la sentencia de creación. Crear la estructura es DDL; no añade filas de productos. Un INSERT posterior proporciona esas filas.

  3. 3
    EjemploCrea cuatro campos
    CREATE TABLE products (
      id INTEGER PRIMARY KEY,
      name TEXT NOT NULL,
      price NUMERIC(8, 2) NOT NULL,
      in_stock INTEGER DEFAULT 0
    );
    

    Hay cuatro definiciones de columna y tres comas de separación. SQLite genera esta clave primaria entera. PostgreSQL necesita una declaración de identidad si debe generarse un identificador omitido.

  4. 4
    ConsejoInspecciona la definición real

    Utiliza PRAGMA table_info(products); en SQL de SQLite o .schema products en su consola de línea de comandos. En psql de PostgreSQL, utiliza \d products.

    La inspección detecta más que errores de sintaxis. SQLite puede interpretar la falta de una coma como parte de un nombre de tipo de varias palabras, dejando una columna donde esperabas dos. SELECT * FROM products; muestra una tabla vacía, pero sus cero filas no verifican todas las reglas.

  5. 5
    Desafío¿Esto reparará una tabla antigua?

    Una tabla products antigua solo tiene id y name. Un script ejecuta CREATE TABLE IF NOT EXISTS products (...) con las cuatro columnas deseadas. ¿Cuántas columnas tiene después la tabla existente?

    ---reveal---

    Sigue teniendo dos. IF NOT EXISTS omite la creación cuando el nombre ya existe. No compara las definiciones ni añade los campos que faltan. Un cambio estructural necesita ALTER TABLE o una reconstrucción deliberada.

  6. 6
    ExplicaciónSepara las cantidades de los códigos

    Almacena las cantidades como números para que funcionen la aritmética y la ordenación numérica. Almacena los códigos como texto cuando sus caracteres tengan significado.

    El código postal estadounidense '02139' pierde su cero inicial como entero. Los valores de texto '100', '25' y '9' se ordenan en ese orden de caracteres, que es incorrecto para cantidades numéricas. La decisión depende de cómo se utilizará el campo, no de si sus ejemplos contienen cifras.

  7. 7
    EjemploInterpreta la precisión y la escala

    NUMERIC(8, 2) de PostgreSQL permite ocho cifras en total, con dos después de la coma. Eso deja seis antes de ella, hasta 999 999,99.

    Un valor de 12,345 se almacena como 12,35. Un valor de 1 234 567,00 falla porque necesita siete cifras antes de la coma. SQLite acepta la misma declaración, pero no exige esta precisión ni esta escala, por lo que esa predicción no se puede trasladar a SQLite.

  8. 8
    Idea claveConserva la exactitud de los importes monetarios

    La coma flotante binaria puede introducir diferencias diminutas en la aritmética decimal. SELECT 0.1 + 0.2 = 0.3; de SQLite devuelve falso.

    Utiliza NUMERIC de PostgreSQL para importes decimales exactos. En SQLite, almacena céntimos enteros: 1999 representa 19,99. Escribir NUMERIC(8, 2) en SQLite no crea un almacenamiento decimal exacto de escala fija. Los tipos aproximados siguen siendo adecuados para medidas como las temperaturas.

  9. 9
    DesafíoMantén las fechas en orden

    Una tabla de SQLite almacena fechas como texto. ¿Por qué cambiar '12/01/2025' y '03/15/2026' a fechas ISO ayuda a ordenar las fechas de forma ascendente?

    ---reveal---

    Las formas ISO son '2025-12-01' y '2026-03-15'. La comparación de texto comprueba entonces año, mes y día en ese orden y coloca primero la fecha anterior. El texto con el mes primero compara el mes antes de llegar al año y coloca estas dos fechas en un orden cronológico incorrecto.

  10. 10
    DesafíoComprueba la tabla y el tipo

    Un script de SQLite crea una tabla si no existe con CREATE TABLE IF NOT EXISTS readings (qty INTEGER);. Una inserción proporciona 'abc' como qty y se realiza correctamente. ¿Qué debes comprobar antes de suponer que qty siempre contiene números?

    ---reveal---

    Inspecciona la definición real, porque IF NOT EXISTS podría haber omitido una tabla antigua. Ten también en cuenta la afinidad normal de SQLite: una declaración de entero puede seguir almacenando texto no numérico. Una tabla STRICT adecuada refuerza la aplicación de los tipos.

  11. 11
    RepasoAdapta la estructura al uso

    Una sentencia de creación define campos, tipos y reglas; una inserción proporciona los registros. Inspecciona la estructura existente en lugar de suponer que un script ejecutado correctamente creó la definición prevista.

    Para cada campo, pregúntate qué debe conservarse: la aritmética numérica, los céntimos exactos, los caracteres de un identificador o el orden cronológico. Aplica el comportamiento de tipos de la base de datos de destino al predecir el resultado almacenado.

2

Protege los productos y los vínculos con los clientes

13 pasos
Sigue las comprobaciones de restricciones, elige claves generadas y predice las acciones de clave foránea.

Guarda esta unidad para seguir cada Lección Interactiva paso a paso.

  1. 1
    IntroducciónComprueba los datos en la base de datos
  2. 2
    ExplicaciónAsigna una función a cada regla
  3. 3
    EjemploSigue una fila aceptada
  4. 4
    Desafío¿Un valor predeterminado corrige un NULL explícito?
  5. 5
    Idea claveUn resultado de comprobación desconocido se acepta
  6. 6
    ExplicaciónIdentifica la fila completa
  7. 7
    EjemploDeja que el sistema elija el identificador
  8. 8
    Desafío¿El siguiente identificador es un recuento de filas?
  9. 9
    ExplicaciónHaz que cada pedido encuentre a su cliente
  10. 10
    EjemploSigue una cascada
  11. 11
    DesafíoConserva los pedidos tras la eliminación
  12. 12
    DesafíoCombina las reglas necesarias
  13. 13
    RepasoComprueba valores, identidad y vínculos
3

Inserta productos y copia pedidos

11 pasos
Asigna valores a columnas, inspecciona las filas copiadas y distingue entre sustituir y añadir existencias.

Guarda esta unidad para seguir cada Lección Interactiva paso a paso.

  1. 1
    IntroducciónElige de dónde proceden las filas nuevas
  2. 2
    EjemploAsigna los valores de un producto
  3. 3
    ConsejoMantén intactos los valores literales
  4. 4
    DesafíoLee la lista explícita
  5. 5
    ExplicaciónAñade un grupo en una sola sentencia
  6. 6
    EjemploRevisa la consulta de archivo
  7. 7
    EjemploUtiliza la consulta como entrada
  8. 8
    ExplicaciónIdentifica la fila propuesta
  9. 9
    Desafío¿Conservar o sustituir?
  10. 10
    DesafíoCopia y vincula sin adivinar
  11. 11
    RepasoSigue los datos de entrada a través de la escritura
4

Modifica exactamente las filas previstas

14 pasos
Aplica actualizaciones calculadas, sigue eliminaciones y prueba los filtros antes de conservar un cambio.

Guarda esta unidad para seguir cada Lección Interactiva paso a paso.

  1. 1
    IntroducciónDistingue qué cambia de qué filas cambian
  2. 2
    EjemploAsigna dos valores nuevos
  3. 3
    EjemploAumenta un precio a partir de su valor anterior
  4. 4
    Desafío¿Cambiarán los demás precios?
  5. 5
    ExplicaciónElimina una fila o vacía un campo
  6. 6
    EjemploSigue los pedidos antiguos cancelados
  7. 7
    DesafíoConserva el historial de un cliente eliminado
  8. 8
    ConsejoReutiliza la condición de la vista previa
  9. 9
    EjemploAplica AND antes que OR
  10. 10
    DesafíoAplica una regla de fecha a ambos estados
  11. 11
    Idea claveUna comparación negativa omite NULL
  12. 12
    DesafíoUtiliza una lista de claves de cliente
  13. 13
    DesafíoInspecciona una actualización de todas las filas
  14. 14
    RepasoComprueba el significado y el efecto
5

Conserva o deshaz un cambio completo

12 pasos
Sigue una transferencia, recupérate de errores y utiliza un punto de guardado sin perder la transacción exterior.

Guarda esta unidad para seguir cada Lección Interactiva paso a paso.

  1. 1
    IntroducciónUna transferencia necesita dos cambios
  2. 2
    ExplicaciónEstablece un límite compartido
  3. 3
    EjemploResta el importe de la transferencia
  4. 4
    EjemploAñade e inspecciona el abono
  5. 5
    DesafíoDeshaz toda la transferencia pendiente
  6. 6
    EjemploSigue un cambio de saldo fallido
  7. 7
    ExplicaciónRecupérate según la base de datos
  8. 8
    DesafíoEvita conservar una operación incompleta
  9. 9
    EjemploMarca un punto intermedio
  10. 10
    Idea claveLiberar no es confirmar la transacción exterior
  11. 11
    Desafío¿Puede deshacerse esta eliminación de tabla?
  12. 12
    RepasoTermina con una decisión deliberada
6

Modifica o elimina una tabla con datos

13 pasos
Añade datos obligatorios por pasos, reconstruye tablas de SQLite cuando sea necesario y sigue las dependencias al eliminar tablas.

Guarda esta unidad para seguir cada Lección Interactiva paso a paso.

  1. 1
    IntroducciónTrabaja con los registros existentes
  2. 2
    EjemploAñade un campo que admita nulos
  3. 3
    DesafíoHaz obligatorio un campo después de rellenarlo
  4. 4
    ConsejoActualiza cada uso externo del nombre
  5. 5
    ExplicaciónReconoce un ALTER limitado
  6. 6
    EjemploPrepara la tabla de sustitución
  7. 7
    EjemploCopia, sustituye y comprueba
  8. 8
    ExplicaciónDecide si debe conservarse la tabla
  9. 9
    EjemploSigue las dependencias de PostgreSQL
  10. 10
    DesafíoDistingue los dos significados de cascada
  11. 11
    ConsejoMantén recuperables los datos y la definición
  12. 12
    DesafíoConserva las reglas durante una reconstrucción
  13. 13
    RepasoSigue la estructura y sus dependencias

Ejercicios de Crear y modificar tablas de base de datos

50 Preguntas de Práctica en 5 sets

Set 1: Crea tablas y realiza los primeros cambios10 Preguntas de Práctica

Pregunta 1 de 10

Un campo nuevo de SQLite debe conservar exactamente el código de cuenta 00481. ¿Qué tipo de almacenamiento es adecuado?
  1. INTEGER
  2. TEXT
  3. REAL
  4. NUMERIC(5, 0)
Mostrar respuestaOcultar respuesta
Respuesta: B
El código es un identificador cuyos caracteres deben conservarse, por lo que el texto mantiene los dos ceros iniciales. El almacenamiento numérico trata esos ceros como carentes de efecto numérico y no conserva esa forma escrita. La precisión numérica describe el almacenamiento de números, no un formato de identificador de longitud fija.

Pregunta 2 de 10

Una columna de PostgreSQL utiliza NUMERIC(6, 2). ¿Cuál es su mayor valor positivo?
  1. 999999,99
  2. 99,9999
  3. 999999
  4. 9999,99
Mostrar respuestaOcultar respuesta
Respuesta: D
La precisión es de seis cifras en total y la escala reserva dos para los decimales, dejando cuatro antes de la coma. Por tanto, el máximo es 9999,99. Tratar seis como el número de cifras anteriores a la coma permitiría demasiadas cifras en total.

Pregunta 3 de 10

Una columna de SQLite es qty INTEGER NOT NULL DEFAULT 4 CHECK (qty >= 0). Una inserción proporciona explícitamente NULL para qty. ¿Qué ocurre?
  1. La inserción incumple la regla NOT NULL.
  2. La fila se inserta con cantidad 4.
  3. La fila se inserta con cantidad 0.
  4. La fila se inserta con cantidad NULL.
Mostrar respuestaOcultar respuesta
Respuesta: A
Un NULL explícito se comprueba como un valor ausente proporcionado, por lo que infringe NOT NULL. El valor predeterminado de 4 se utiliza cuando se omite la columna, no cuando se envía explícitamente un valor ausente. La comprobación de no negatividad no sustituye la regla de presencia.

Pregunta 4 de 10

Una tabla de PostgreSQL necesita generar identificadores cuando las inserciones omiten id. ¿Qué definición de columna proporciona ese comportamiento?
  1. id INTEGER PRIMARY KEY NOT NULL CHECK (id > 0)
  2. id INTEGER UNIQUE NOT NULL DEFAULT 1
  3. id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY
  4. id INTEGER NOT NULL CHECK (id >= 1)
Mostrar respuestaOcultar respuesta
Respuesta: C
Una declaración de identidad proporciona un valor generado por una secuencia, mientras que la clave primaria garantiza la identidad de la fila. Una clave primaria entera simple solo comprueba los valores proporcionados; no genera un identificador omitido. Un valor predeterminado constante de 1 repetiría el mismo valor en lugar de generar identificadores nuevos.

Pregunta 5 de 10

Se aplican las restricciones de clave foránea. Una fila hija utiliza supplier_id = 18, pero el proveedor 18 no existe. ¿Qué debe hacerse para insertar correctamente esa misma referencia no NULL?
  1. Añadir una clave primaria distinta a la fila hija.
  2. Confirmar la fila hija antes de añadir el proveedor.
  3. Crear primero la fila del proveedor correspondiente.
  4. Asignar a supplier_id un valor predeterminado no NULL.
Mostrar respuestaOcultar respuesta
Respuesta: C
El valor proporcionado en la fila hija debe coincidir con una clave padre existente, por lo que el proveedor 18 debe existir antes de insertar esa referencia con la comprobación inmediata normal. Una clave hija distinta no repara la ausencia de la fila padre. Un valor predeterminado no sustituye el 18 proporcionado explícitamente.

Pregunta 6 de 10

Una tabla declara name antes de code. Una inserción utiliza (code, name) con los valores ('R7', 'Notebook'). ¿Qué se almacena en name?
  1. El texto Notebook.
  2. El texto R7.
  3. El texto R7, Notebook.
  4. Un valor ausente, NULL.
Mostrar respuestaOcultar respuesta
Respuesta: A
La lista explícita de columnas controla la correspondencia: el segundo valor va a la segunda columna enumerada, name. El orden de declaración de la tabla no anula esa lista. Leer los valores en el orden de la tabla intercambiaría incorrectamente el código y el nombre.

Pregunta 7 de 10

Una fila tiene qty 9. ¿Qué asignación reduce la cantidad almacenada en 3?
  1. SET qty = 3
  2. SET qty = 9 - qty
  3. SET qty = qty * 3
  4. SET qty = qty - 3
Mostrar respuestaOcultar respuesta
Respuesta: D
El valor nuevo debe calcularse a partir de la cantidad almacenada, por lo que restar 3 deja 6. Asignar la constante 3 sustituye la cantidad por 3 y no significa reducirla en 3. Utilizar la columna en la expresión también aplica el mismo cambio relativo a otras cantidades.

Pregunta 8 de 10

Una tabla contiene 12 filas. DELETE FROM logs; se ejecuta correctamente. ¿Qué queda?
  1. La definición de logs y las 12 filas.
  2. Una tabla logs vacía con su definición.
  3. Ninguna tabla logs ni ninguna fila.
  4. Una fila de logs con valores ausentes.
Mostrar respuestaOcultar respuesta
Respuesta: B
Sin filtro, DELETE elimina las 12 filas y deja disponible la estructura de la tabla para inserciones posteriores. No elimina columnas ni sustituye los registros por valores ausentes. Eliminar la propia tabla requiere DROP TABLE, que es una operación estructural independiente.

Pregunta 9 de 10

Una conexión de SQLite ejecuta BEGIN, cambia una cantidad de 8 a 11 y después ejecuta ROLLBACK. ¿Qué cantidad lee esa conexión a continuación?
  1. 11
  2. 3
  3. 0
  4. 8
Mostrar respuestaOcultar respuesta
Respuesta: D
El cambio de 8 a 11 seguía pendiente en la transacción abierta. Una reversión completa lo deshace y restaura el valor anterior 8. El aumento de 3 es una cantidad de cambio, no la cantidad restaurada; ningún paso confirmado hizo permanente el 11.

Pregunta 10 de 10

Una tabla de PostgreSQL tiene filas existentes y ninguna columna phone. Todas las filas deben acabar teniendo su propio teléfono real y no hay un único valor predeterminado adecuado. ¿Qué secuencia cumple ese requisito?
  1. Añadir phone admitiendo nulos; rellenar teléfonos válidos; establecer NOT NULL.
  2. Añadir phone como NOT NULL; rellenar teléfonos válidos; quitar su valor predeterminado.
  3. Añadir phone admitiendo nulos; establecer NOT NULL; rellenar teléfonos válidos.
  4. Añadir phone con DEFAULT NULL; establecer NOT NULL; rellenar teléfonos válidos.
Mostrar respuestaOcultar respuesta
Respuesta: A
Añadir un campo que admita nulos permite que los registros existentes sigan siendo válidos mientras se rellenan sus teléfonos reales. Solo después de resolver todos los valores ausentes puede aplicarse correctamente SET NOT NULL. Exigir los valores antes de rellenarlos falla porque las filas existentes aún contendrían NULL.
Set 2: Diagnostica errores habituales de SQL10 Preguntas de Práctica

Guarda esta unidad para ver todas las respuestas y practicar cada set.

Pregunta 1 de 10

Una tabla labels de SQLite ya tiene solo las columnas id y text. Un script ejecuta CREATE TABLE IF NOT EXISTS labels (id INTEGER PRIMARY KEY, text TEXT, color TEXT);. ¿Qué ocurre con color?
  1. Se añade y se rellena con valores ausentes.
  2. Sustituye a la columna text existente.
  3. No se añade a la tabla existente.
  4. Se añade solo tras la siguiente inserción.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 2 de 10

Un script ejecuta CREATE TABLE tickets (id INTEGER PRIMARY KEY, label TEXT);. No se ejecutan más sentencias. ¿Qué existe después?
  1. Una tabla con una fila por cada columna.
  2. Una tabla vacía con dos columnas.
  3. Una tabla vacía solo con la columna id.
  4. Dos tablas vacías llamadas id y label.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 3 de 10

En PostgreSQL, score admite nulos y solo tiene CHECK (score BETWEEN 0 AND 100). Una inserción proporciona NULL. ¿Qué ocurre?
  1. Se rechaza porque la comprobación es falsa.
  2. Se almacena como el extremo inferior, cero.
  3. Se acepta después de que NULL pase a ser 100.
  4. Se acepta porque la comprobación es desconocida.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 4 de 10

Un proyecto tiene dos tareas. Su clave foránea project_id utiliza ON DELETE SET NULL, y project_id también es NOT NULL. Se aplican las restricciones de clave foránea. ¿Qué ocurre al eliminar el proyecto?
  1. La eliminación falla; se conservan el proyecto y ambas tareas.
  2. Se elimina el proyecto y ambas tareas quedan desvinculadas.
  3. Se eliminan el proyecto y sus dos tareas.
  4. La eliminación se realiza y ambas tareas conservan la clave anterior.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 5 de 10

Las existencias del código R2 son 7. Un registro de entrada indica un recuento de sustitución de 11. ¿Qué asignación de inserción o actualización almacena el recuento previsto?
  1. SET qty = stock.qty + excluded.qty
  2. SET qty = excluded.qty
  3. SET qty = stock.qty - excluded.qty
  4. SET qty = stock.qty
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 6 de 10

Una tabla tiene estados ausentes y no ausentes. Una escritura debe seleccionar todas las filas cuyo estado no sea pagado, incluidos los estados ausentes. ¿Qué condición funciona?
  1. status <> 'paid' AND status IS NULL
  2. status <> 'paid' OR status = NULL
  3. status <> 'paid' OR status IS NULL
  4. status <> 'paid' AND status IS NOT NULL
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 7 de 10

Una escritura debe establecer el color y la cantidad de una fila. ¿Cómo se separan las dos asignaciones dentro de SET?
  1. Con una coma.
  2. Con AND.
  3. Con WHERE.
  4. Con otro SET.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 8 de 10

Una transacción de SQLite empieza con saldos de 80 y 40. Una primera actualización resta 15 al primer saldo. Una segunda resta 50 al segundo e incumple CHECK (balance >= 0). Con la gestión normal de restricciones, ¿qué conservaría COMMIT?
  1. Saldos de 80 y 40.
  2. Saldos de 65 y -10.
  3. Saldos de 80 y -10.
  4. Saldos de 65 y 40.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 9 de 10

Una tabla de SQLite con datos recibe active INTEGER NOT NULL DEFAULT 1. ¿Qué valor de active tienen sus filas existentes?
  1. NULL
  2. 1
  3. 0
  4. Sus identificadores de fila.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 10 de 10

Una tabla temporal de archivo debe dejar de existir, incluidas sus filas y su definición. ¿Qué sentencia realiza esa eliminación?
  1. DELETE FROM archive;
  2. TRUNCATE TABLE archive;
  3. DROP TABLE archive;
  4. ALTER TABLE archive RENAME TO old_archive;
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Set 3: Sigue los resultados almacenados10 Preguntas de Práctica

Guarda esta unidad para ver todas las respuestas y practicar cada set.

Pregunta 1 de 10

Un campo de PostgreSQL es NUMERIC(5, 2). ¿Qué ocurre con un valor insertado de 48,726?
  1. Se almacena como 48,73.
  2. Se almacena como 48,72.
  3. Se almacena como 48,726.
  4. Falla por superar cinco cifras en total.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 2 de 10

Una tabla tiene UNIQUE (room_id, start_time). Contiene (4, '09:00') y (5, '09:00'). ¿Qué ocurre al insertar (4, '10:00')?
  1. Falla porque se repite la sala 4.
  2. Falla porque dos salas comparten las 09:00.
  3. Sustituye el registro de la sala 4.
  4. Se inserta porque el par es nuevo.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 3 de 10

En una tabla normal de SQLite, una clave primaria de texto obligatoria se declara code TEXT PRIMARY KEY. ¿Qué regla adicional cierra la excepción histórica de SQLite que permite claves ausentes?
  1. Añadir DEFAULT NULL.
  2. Añadir CHECK (code = code).
  3. Añadir NOT NULL.
  4. Añadir otro UNIQUE.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 4 de 10

Una inserción normal de varias filas en PostgreSQL propone tres registros. El último repite un código único existente. ¿Qué ocurre con los dos primeros registros propuestos?
  1. Ambos se insertan antes del error.
  2. Ninguno se inserta mediante esa sentencia.
  3. Solo se inserta el primer registro.
  4. Ambos se insertan con códigos ausentes.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 5 de 10

Una tabla de SQLite tiene id generado, name obligatorio y qty INTEGER NOT NULL DEFAULT 6. ¿Qué inserción añade un pincel utilizando ese valor predeterminado?
  1. INSERT INTO tools (name, qty) VALUES ('Brush', NULL);
  2. INSERT INTO tools (name, qty) VALUES ('Brush', DEFAULT);
  3. INSERT INTO tools (id, name) VALUES ('Brush', 6);
  4. INSERT INTO tools (name) VALUES ('Brush');
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 6 de 10

Debe conservarse una fila de cliente, pero su valor opcional de teléfono debe pasar a estar ausente. ¿Qué sentencia lo hace?
  1. DELETE FROM clients WHERE id = 28;
  2. UPDATE clients SET phone = NULL WHERE id = 28;
  3. UPDATE clients SET phone = 'NULL' WHERE id = 28;
  4. ALTER TABLE clients DROP COLUMN phone;
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 7 de 10

Los casos son 71 (cerrado, 2025-08-01), 72 (abierto, 2026-02-02), 73 (cerrado, 2026-03-01) y 74 (vencido, 2025-09-01). ¿Qué identificadores cumplen state = 'closed' OR state = 'expired' AND opened < '2026-01-01'?
  1. 71, 73 y 74.
  2. Solo 71 y 74.
  3. Solo 71 y 73.
  4. Solo 73 y 74.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 8 de 10

Una transacción explícita aumenta un recuento de 5 a 8. Antes de confirmar, la misma conexión consulta la fila. ¿Qué recuento lee?
  1. 5
  2. 3
  3. 8
  4. Ninguna fila hasta confirmar.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 9 de 10

Una transacción empieza con contadores a = 2 y b = 7. Aumenta a en 3, establece el punto de guardado s, aumenta b en 4, ejecuta ROLLBACK TO s y confirma. ¿Qué queda?
  1. a = 5 y b = 7.
  2. a = 2 y b = 7.
  3. a = 5 y b = 11.
  4. a = 2 y b = 11.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 10 de 10

En PostgreSQL, invoices hace referencia a clients mediante una clave foránea. DROP TABLE clients CASCADE; se ejecuta correctamente. ¿Qué puede conservarse de invoices?
  1. Su tabla, con todas las filas de facturas eliminadas.
  2. Sus filas, aún vinculadas por la clave foránea anterior.
  3. Ninguna tabla invoices, porque hacía referencia a clients.
  4. Sus filas y su tabla, sin esa clave foránea.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Set 4: Elige una secuencia fiable10 Preguntas de Práctica

Guarda esta unidad para ver todas las respuestas y practicar cada set.

Pregunta 1 de 10

En SQLite, CREATE TABLE t (a INTEGER b TEXT); se ejecuta correctamente. La inspección muestra solo la columna a. ¿Por qué?
  1. SQLite creó b solo después de la primera inserción.
  2. SQLite fusionó tipos de datos iguales en una columna.
  3. SQLite trató b como un valor predeterminado ausente.
  4. SQLite leyó las palabras restantes como un nombre de tipo.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 2 de 10

Una tabla de PostgreSQL con una columna de identidad tiene actualmente los identificadores 2, 6 y 9. ¿Cuántas filas devuelve COUNT(*)?
  1. 9
  2. 7
  3. 3
  4. 6
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 3 de 10

Se aplican las restricciones de clave foránea. El equipo 8 tiene los miembros 81 y 82; el equipo 9 tiene al miembro 83. La clave foránea de miembros admite nulos y tiene ON DELETE SET NULL. Tras eliminar el equipo 8, ¿cuántos miembros siguen vinculados a un equipo?
  1. Tres miembros, sin ninguno desvinculado.
  2. Un miembro, con dos miembros desvinculados.
  3. Un miembro, con los otros dos eliminados.
  4. Ningún miembro, con tres miembros desvinculados.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 4 de 10

Con confirmación automática y sin transacción explícita, un origen tiene los identificadores 61 y 62 antes de un límite y el 63 después. Un destino vacío tiene clave primaria en id. Un INSERT SELECT filtrado copia los identificadores anteriores al límite y después se repite exactamente, sin cláusula de conflicto. ¿Cuál es el destino final?
  1. 61 y 62 una vez cada uno; la segunda copia falla.
  2. 61 y 62 dos veces cada uno; ambas copias se realizan.
  3. 61, 62 y 63 una vez cada uno; la segunda copia falla.
  4. Ninguna fila de destino; la segunda copia deshace la primera.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 5 de 10

Una fila de existencias de PostgreSQL tiene código K8 y qty 14. Una sentencia propone (K8, 6) con ON CONFLICT (code) DO UPDATE SET qty = stock.qty + excluded.qty. Después se ejecuta de nuevo la misma sentencia. ¿Qué qty se almacena?
  1. 20
  2. 12
  3. 26
  4. 14
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 6 de 10

Una actualización de SQLite ejecutada correctamente selecciona cuatro filas, todas con active = 1, y establece active = 1. ¿Qué recuento indica changes()?
  1. 0
  2. 1
  3. 8
  4. 4
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 7 de 10

Los pedidos tienen estos estados: 91 (cancelado, 2025-04-01), 92 (NULL, 2025-05-01), 93 (cancelado, 2026-02-01), 94 (pagado, 2025-06-01). ¿Qué condición selecciona pedidos cancelados o con estado ausente solo anteriores a 2026?
  1. (status = 'cancelled' OR status IS NULL) AND day < '2026-01-01'
  2. status = 'cancelled' OR status IS NULL AND day < '2026-01-01'
  3. (status = 'cancelled' OR status = NULL) AND day < '2026-01-01'
  4. (status = 'cancelled' AND status IS NULL) AND day < '2026-01-01'
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 8 de 10

Con confirmación automática, un UPDATE independiente se ejecuta correctamente. Un segundo UPDATE independiente falla y después se ejecuta ROLLBACK. ¿Qué ocurre con la primera actualización?
  1. Se deshace también.
  2. Permanece confirmada.
  3. Espera un COMMIT.
  4. Se rehace después.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 9 de 10

Las tablas dependen en este orden: line_items hace referencia a sales y sales hace referencia a buyers. Deben eliminarse las tres sin cascada. ¿Qué orden respeta sus dependencias?
  1. buyers, después sales y después line_items.
  2. sales, después line_items y después buyers.
  3. line_items, después sales y después buyers.
  4. line_items, después buyers y después sales.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 10 de 10

Una tabla de SQLite se copia con CREATE TABLE saved AS SELECT * FROM original;. ¿Qué debe comprobarse antes de tratar saved como una sustitución completa?
  1. Sus restricciones, que no se copiaron.
  2. Sus filas, que siempre están ausentes.
  3. Su vínculo al origen, que se actualiza siempre.
  4. Su nombre, que aún debe ser original.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Set 5: Aplica las reglas a cambios combinados10 Preguntas de Práctica

Guarda esta unidad para ver todas las respuestas y practicar cada set.

Pregunta 1 de 10

Una tabla normal de SQLite declara value NUMERIC(7, 2). Insertar 6,789 se realiza correctamente. ¿Qué valor almacenado debes esperar solo a partir de esta declaración?
  1. 6,79
  2. 6,789
  3. 6,78
  4. 679
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 2 de 10

Un campo de PostgreSQL es label TEXT NOT NULL sin más reglas. ¿Qué ocurre cuando el valor proporcionado es una cadena vacía?
  1. Se acepta como texto vacío presente.
  2. Se rechaza como un valor ausente.
  3. Se rellena con un espacio antes de almacenarse.
  4. Se acepta tras convertirse en NULL.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 3 de 10

En SQLite, con las restricciones de clave foránea activadas, un vínculo hijo es parent_id INTEGER DEFAULT 90 REFERENCES parents(id) ON DELETE SET DEFAULT. La fila padre 90 no existe. La fila hija 12 apunta a la padre 7. ¿Qué ocurre al eliminar la fila padre 7?
  1. La fila hija se conserva y su vínculo pasa a ser 90.
  2. La fila hija se conserva y su vínculo pasa a ser NULL.
  3. Se eliminan tanto la fila padre como su fila hija.
  4. La eliminación falla porque el valor predeterminado no tiene fila padre.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 4 de 10

Una fila de existencias tiene cantidad 9. Dos registros de entrega proponen 4 cada uno, pero ambos ejecutan DO UPDATE SET qty = excluded.qty. ¿Qué cantidad se almacena tras ambas importaciones y qué total habría producido una suma correcta?
  1. Almacenado 4; total correcto de entregas 13.
  2. Almacenado 8; total correcto de entregas 17.
  3. Almacenado 4; total correcto de entregas 17.
  4. Almacenado 9; total correcto de entregas 8.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 5 de 10

Una clave foránea aplicada utiliza la acción de eliminación de bloqueo predeterminada. Una reserva es la única fila que hace referencia al cliente 44. ¿Cómo puede eliminarse el cliente 44 conservando esa reserva vinculada a un cliente 45 válido y existente?
  1. Actualizar la reserva a 45; eliminar el cliente 44.
  2. Eliminar el cliente 44; actualizar la reserva a 45.
  3. Borrar la clave de la reserva; conservar el cliente 44.
  4. Eliminar el cliente 45; actualizar la reserva a 44.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 6 de 10

Una consulta de PostgreSQL para clientes que cumplen los requisitos devuelve los identificadores 31 y 34. Deben actualizarse los pedidos de ambos. El código utiliza customer_id = (SELECT id FROM customers WHERE eligible = TRUE). ¿Qué ocurre y qué comparación lo corrige?
  1. Actualiza ambos clientes; mantener la igualdad.
  2. Actualiza el primer cliente; utilizar IN.
  3. Da error por varias filas; utilizar IN.
  4. No actualiza clientes; utilizar IS NULL.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 7 de 10

Los saldos de las cuentas 1 y 2 empiezan en 300 y 90. Una transacción transfiere 40 de la cuenta 1 a la 2 y confirma. Una transacción nueva suma 10 a la cuenta 2, establece el punto de guardado s, suma 5 a la cuenta 1, vuelve a s y después revierte por completo. ¿Qué saldos quedan?
  1. 300 y 90, total 390.
  2. 260 y 140, total 400.
  3. 265 y 140, total 405.
  4. 260 y 130, total 390.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 8 de 10

Una transacción de PostgreSQL actualiza la fila A, establece el punto de guardado s y después incumple una comprobación al actualizar B. ¿Qué puede recuperar la transacción manteniendo A pendiente?
  1. Ejecutar RELEASE s y después continuar.
  2. Ejecutar ROLLBACK TO s y después continuar.
  3. Ejecutar COMMIT y después continuar la transacción.
  4. Ejecutar otro UPDATE B antes de cualquier reversión.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 9 de 10

Una reconstrucción de SQLite necesita una comprobación nueva y tiene índices dependientes y claves foráneas (FK) activadas. ¿Qué secuencia conserva las reglas previstas y comprueba las referencias?
  1. Iniciar; desactivar FK; copiar sin reglas; sustituir; confirmar; activar FK; comprobar objetos después.
  2. Desactivar FK; iniciar; copiar sin reglas; sustituir; comprobar FK; confirmar; dejar FK desactivadas.
  3. Desactivar FK; iniciar; definir y copiar; sustituir; confirmar; comprobar FK; descartar los índices dependientes.
  4. Desactivar FK; iniciar; definir y copiar; sustituir y restaurar objetos; comprobar FK; confirmar; activar FK.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 10 de 10

Una columna stock de PostgreSQL contiene 5, NULL y -2. Debe pasar a ser NOT NULL con CHECK (stock >= 0), conservando todas las filas. Los recuentos ausentes deben pasar a 0 y los negativos deben corregirse. ¿Qué secuencia establece ambas reglas?
  1. Establecer DEFAULT 0; corregir -2; añadir ambas restricciones.
  2. Rellenar los NULL con 0; corregir -2; añadir ambas restricciones.
  3. Rellenar los NULL con 0; conservar -2; añadir ambas restricciones.
  4. Rellenar los NULL con 0; corregir -2; añadir solo la comprobación.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

¿Te atascas con una pregunta tuya? Ayuda con Tareas

Términos Clave

70 Términos Clave, cada uno con su definición

A

ADD COLUMN
La operación ADD COLUMN amplía una tabla con un campo nuevo y asigna a las filas existentes su valor predeterminado o NULL cuando no se declara ninguno.
Añadir active INTEGER NOT NULL DEFAULT 1 asigna a los clientes existentes el valor nuevo 1 sin inserciones independientes.
Afinidad de tipo
La afinidad de tipo es la preferencia de SQLite por un tipo de almacenamiento para una columna, que puede convertir entradas adecuadas sin rechazar todas las de otros tipos.
Una columna entera normal de SQLite convierte '5' en 5, pero puede conservar 'abc' como texto sin dar error.
ALTER TABLE
La sentencia ALTER TABLE modifica la definición de una tabla existente, como sus columnas o restricciones, y conserva sus filas.
Añadir un campo de teléfono modifica la estructura con ALTER TABLE; rellenar después los valores de teléfono utiliza UPDATE.
Aplicación de las restricciones de clave foránea
La aplicación de las restricciones de clave foránea es la comprobación activa por la base de datos de las referencias y acciones declaradas al insertar, modificar o eliminar filas relacionadas.
SQLite necesita PRAGMA foreign_keys = ON; en la conexión antes de una transacción para comprobar sus vínculos declarados.
Asignación SET
Una asignación SET indica una columna y su valor nuevo o expresión dentro de UPDATE; las comas separan las asignaciones a varias columnas.
SET in_stock = in_stock - 1 reduce el recuento almacenado, mientras que SET in_stock = 1 lo sustituye por uno.
Atomicidad
La atomicidad es la propiedad de todo o nada que permite conservar o deshacer como una sola operación los cambios relacionados de una transacción.
Una transferencia completada debe conservar ambos cambios de saldo; conservar solo el cargo dejaría incompleta la operación.
AUTOINCREMENT
La palabra clave AUTOINCREMENT de SQLite impide que una clave primaria entera generada reutilice números que hayan tenido filas confirmadas, con un coste adicional.
Después de los identificadores confirmados 1, 2 y 3, eliminar 3 hace que el siguiente identificador generado por AUTOINCREMENT siga siendo 4.

C

CHECK
Una restricción CHECK comprueba una condición sobre una fila y rechaza un resultado falso; se acepta un resultado desconocido debido a NULL.
CHECK (price > 0) rechaza un precio negativo, pero también necesita NOT NULL cuando es obligatorio proporcionar un precio.
Clave compuesta
Una clave compuesta identifica una fila mediante la combinación de los valores de varias columnas, sin exigir que cada columna sea única por sí sola.
El par de identificador de pedido e identificador de producto identifica una línea de pedido y permite ambos valores en otros pares.
Clave foránea
Una clave foránea exige que los valores hijos no ausentes coincidan con una clave primaria o única padre referenciada cuando su aplicación está activada.
Un pedido con identificador de cliente 99 falla cuando no existe el cliente 99 y se exige la relación con el cliente.
Clave natural
Una clave natural es un valor del mundo real que ya identifica un registro y se utiliza como su clave en lugar de un número artificial.
El ISBN de un libro puede identificar su edición, mientras que un identificador interno de libro generado sería una clave sustituta.
Clave primaria
Una clave primaria es una columna o combinación de columnas que identifica de forma única una fila y debe tener un valor no ausente.
Un identificador de cliente permite que una actualización seleccione a un cliente aunque varios compartan el mismo nombre.
Clave sustituta
Una clave sustituta es un identificador artificial sin significado descriptivo, a menudo generado para que los datos del mundo real puedan cambiar de forma independiente.
El identificador generado de un cliente se mantiene tras cambiar el correo y conserva las referencias desde los pedidos.
Columna de identidad
Una columna de identidad genera valores a partir de una secuencia en PostgreSQL cuando una inserción solicita un valor generado para esa columna.
INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY proporciona identificadores nuevos sin indicar manualmente un número en cada inserción.
Coma flotante
La coma flotante representa números como aproximaciones binarias, lo que permite trabajar eficientemente con medidas, pero puede producir pequeños errores de redondeo decimal.
SQLite puede evaluar 0.1 + 0.2 = 0.3 como falso porque sus literales decimales utilizan almacenamiento aproximado.
COMMIT
La orden COMMIT termina una transacción haciendo permanentes sus cambios pendientes, tras lo cual una reversión posterior no puede deshacer ese trabajo.
Después de inspeccionar ambos saldos de la transferencia, confirmar conserva el cargo y el abono como la transferencia completada.
Condición WHERE
Una condición WHERE comprueba cada fila para seleccionarla en una consulta o escritura; solo se seleccionan las filas para las que la condición es verdadera.
Una actualización filtrada por la clave primaria del producto selecciona como máximo una fila, aunque se repitan los nombres de producto.
Confirmación automática
La confirmación automática confirma cada sentencia independiente que se ejecuta correctamente como su propia transacción, salvo que la sesión haya abierto una transacción explícita.
Dos actualizaciones de saldo con confirmación automática pueden hacerse permanentes por separado y dejar la operación incompleta si el proceso se detiene.
Confirmación implícita
Una confirmación implícita hace permanentes los cambios pendientes como efecto automático de otra sentencia, como el DDL normal de tablas permanentes de MySQL.
Crear una tabla en MySQL puede confirmar una actualización anterior, por lo que una reversión posterior no deshace esa actualización.
CREATE TABLE
La sentencia CREATE TABLE crea una tabla nueva con columnas con nombre, tipos declarados y reglas opcionales, inicialmente sin filas.
CREATE TABLE labels (id INTEGER PRIMARY KEY, name TEXT); prepara una tabla antes de insertar etiquetas.
CREATE TABLE AS
La sentencia CREATE TABLE AS crea una tabla a partir de los resultados de una consulta y copia los datos seleccionados sin las restricciones del origen en SQLite y PostgreSQL.
Una copia cheap_products contiene los productos seleccionados cuando se creó, incluso después de que cambien los precios del origen.

D

DEFAULT
Un DEFAULT proporciona un valor cuando una inserción omite una columna; no sustituye un valor ausente proporcionado explícitamente.
Omitir una columna de existencias con DEFAULT 0 asigna cero, mientras que proporcionar explícitamente NULL la deja ausente.
DELETE
La sentencia DELETE elimina filas completas seleccionadas por una condición, o todas las filas cuando no se proporciona ninguna condición, y conserva la tabla.
Eliminar pedidos antiguos cancelados conserva los demás pedidos y mantiene la tabla preparada para inserciones futuras.
Dependencia
Existe una dependencia cuando un objeto de la base de datos se apoya en la definición de otro, lo que puede bloquear la eliminación o modificación de ese otro objeto.
Una clave foránea de pedidos depende de clientes, por lo que eliminar primero los clientes puede fallar mientras se conserve el vínculo.
DROP CASCADE
DROP CASCADE de PostgreSQL elimina los objetos dependientes junto con el objeto nombrado, incluidas las claves foráneas que lo referencian y las vistas dependientes.
Eliminar clientes con CASCADE puede conservar los pedidos almacenados, pero eliminar la clave foránea que los vinculaba a los clientes.
DROP COLUMN
La operación DROP COLUMN elimina una columna y sus valores almacenados de una tabla, y puede quedar bloqueada por reglas u objetos dependientes.
Eliminar un campo de teléfono móvil descarta todos sus valores almacenados y deja intactos los demás campos de los clientes.
DROP TABLE
La sentencia DROP TABLE elimina de la base de datos una tabla junto con todas sus filas y sus propias restricciones, índices y disparadores.
Después de eliminar la tabla de archivo, insertar en ella falla hasta que se vuelva a crear una tabla con ese nombre.

E

Eliminación lógica
Una eliminación lógica marca una fila almacenada como eliminada mediante un valor, como una marca de tiempo de eliminación, y exige que las consultas de filas activas la excluyan.
Establecer el deleted_at de un cliente conserva la fila, por lo que las consultas de clientes activos añaden deleted_at IS NULL.
Escala
La escala de un tipo decimal es el número de cifras después de la coma decimal; PostgreSQL redondea los valores almacenados a esa escala.
Una columna NUMERIC(8, 2) de PostgreSQL almacena 12,345 como 12,35 porque la escala declarada es dos.
excluded
El nombre excluded hace referencia a la fila propuesta para insertar durante una actualización por conflicto de PostgreSQL o SQLite y permite utilizar sus valores de entrada.
Para una entrega, stock.qty + excluded.qty suma la cantidad de entrada propuesta a la cantidad ya almacenada.

F

Fecha en formato ISO
Una fecha en formato ISO escrita como YYYY-MM-DD coloca primero el año y permite que las fechas de texto con formato uniforme se ordenen cronológicamente.
Las fechas de texto de SQLite, como '2026-03-15', se ordenan por año, mes y día cuando todas utilizan el mismo formato.

I

Identificador
Un identificador es el nombre de un objeto de la base de datos, como una tabla o columna; las comillas dobles permiten incluir espacios o palabras reservadas.
El identificador de columna "order date" necesita comillas, mientras que order_date evita los espacios y es más fácil de reutilizar.
IF EXISTS
La cláusula IF EXISTS suprime un error por ausencia en una sentencia de eliminación de objetos, pero sigue eliminando el objeto nombrado cuando existe.
DROP TABLE IF EXISTS archived_orders; se ejecuta correctamente cuando la tabla no existe y la elimina cuando existe.
IN
La prueba IN comprueba si un valor coincide con un elemento de una lista, incluida una lista de claves devuelta por una consulta SELECT anidada.
Los pedidos de varios clientes de California pueden seleccionarse con los identificadores de cliente devueltos por una subconsulta.
Inserción de varias filas
Una inserción de varias filas proporciona varios grupos de valores entre paréntesis en una sentencia, comprobados en su conjunto con la gestión normal de restricciones.
Pueden añadirse tres filas de clientes con una sentencia; un fallo normal de restricción en una rechaza las tres.
Inserción o actualización
Una inserción o actualización intenta insertar una fila y puede actualizar una existente cuando una clave o un valor único entra en conflicto con los datos nuevos propuestos.
Una importación de existencias puede añadir un SKU nuevo o actualizar su recuento con ON CONFLICT (sku) DO UPDATE cuando ya existe.
INSERT
La sentencia INSERT añade filas a una tabla existente utilizando grupos de valores literales o resultados de consultas que deben cumplir las reglas de destino.
Una tienda inserta un producto nuevo con su SKU, nombre y precio, dejando que la base de datos genere su identificador.
INSERT SELECT
Una sentencia INSERT SELECT copia las filas devueltas por una consulta en una tabla existente y asigna las columnas seleccionadas a las de destino por posición.
La tienda revisa los pedidos anteriores a 2026 y después copia los registros devueltos en su tabla de archivo ya definida.
INTEGER
El tipo INTEGER representa números enteros, por lo que es adecuado para recuentos e importes exactos almacenados como céntimos enteros.
Un importe exacto de 19,99 en SQLite puede almacenarse como 1999 en una columna de céntimos enteros para cálculos posteriores.
IS NULL
La prueba IS NULL selecciona directamente los valores ausentes, a diferencia de la igualdad normal con NULL, que nunca es verdadera para un valor ausente.
WHERE phone IS NULL encuentra clientes sin número de teléfono; WHERE phone = NULL no encuentra esas filas.

L

Lenguaje de definición de datos
El lenguaje de definición de datos, o DDL, es la familia de sentencias SQL que crea, modifica y elimina la estructura de la base de datos.
CREATE TABLE, ALTER TABLE y DROP TABLE modifican la estructura de la base de datos en distintas etapas.
Lenguaje de manipulación de datos
El lenguaje de manipulación de datos, o DML, es la familia de sentencias SQL que añade, modifica y elimina filas en tablas existentes.
Añadir un pedido utiliza INSERT; corregir su estado utiliza UPDATE; eliminar su fila utiliza DELETE.
Lista de columnas
La lista de columnas de una inserción nombra explícitamente los campos de destino y determina cómo se les asignan los valores proporcionados por posición.
Enumerar (sku, name, price) hace que el primer valor proporcionado sea un SKU aunque price se declarara antes en la tabla.
Literal de cadena
Un literal de cadena es texto escrito como valor en SQL entre comillas simples, con los apóstrofos internos duplicados para mantenerlos dentro del texto.
El literal SQL 'O''Brien' almacena el nombre «O'Brien» con un apóstrofo en lugar de terminar el valor antes de tiempo.

N

NOT NULL
Una restricción NOT NULL exige que el valor de una columna esté presente en todas las filas, aunque acepta cadenas vacías en SQLite y PostgreSQL.
Omitir de una inserción un nombre de producto obligatorio provoca un error cuando no tiene valor predeterminado ni se ha proporcionado un valor.
NULL
NULL es el marcador de SQL para un valor ausente o desconocido, distinto tanto de un cero numérico como de una cadena de texto vacía.
Un campo de teléfono opcional utiliza NULL cuando no se conoce ningún número; IS NULL encuentra a esos clientes.
Número de filas afectadas
El número de filas afectadas indica cuántas filas ha actualizado una sentencia; SQLite y PostgreSQL incluyen las filas seleccionadas a las que se asignan sus valores actuales.
Una actualización que establece tres indicadores de actividad existentes en sus mismos valores puede seguir indicando tres filas actualizadas.

O

ON DELETE CASCADE
La acción ON DELETE CASCADE elimina automáticamente las filas hijas que referencian una fila padre cuando esta se elimina y se aplica la restricción de clave foránea.
Con una cascada, eliminar al cliente Ana elimina sus pedidos 101 y 102, mientras que el cliente Ben y su pedido 103 se conservan.
ON DELETE SET NULL
La acción ON DELETE SET NULL conserva las filas hijas tras eliminar una fila padre, pero borra sus vínculos, por lo que requiere columnas de referencia que admitan nulos.
Cuando se elimina un proveedor, los productos pueden conservarse con identificadores de proveedor ausentes si ese vínculo es opcional.

P

Precedencia de operadores
La precedencia de operadores determina qué partes de una expresión se agrupan primero; SQL evalúa AND antes que OR salvo que los paréntesis cambien ese orden.
Agrupar dos estados entre paréntesis hace que un límite de fecha compartido se aplique a ambas ramas de la condición.
Precisión de NUMERIC
La precisión de NUMERIC es el número total declarado de cifras decimales, incluidas las anteriores y posteriores a la coma decimal.
NUMERIC(8, 2) de PostgreSQL permite seis cifras antes de la coma decimal y dos después, hasta 999 999,99.
Punto de guardado
Un punto de guardado es un punto intermedio con nombre dentro de una transacción que permite deshacer el trabajo posterior y conservar los cambios pendientes anteriores.
Colocar un punto de guardado después de la primera actualización permite deshacer la segunda sin perder la primera.

R

Reconstrucción de tabla
Una reconstrucción de tabla crea una definición de sustitución, copia los datos existentes, sustituye la tabla anterior y restaura los objetos dependientes.
SQLite puede incorporar una comprobación nueva sobre una columna existente mediante una transacción que reconstruye la tabla y comprueba las filas copiadas.
RELEASE
La orden RELEASE elimina un punto de guardado sin deshacer sus cambios posteriores ni confirmar de forma independiente la transacción exterior.
Después de liberar un punto de guardado dentro de BEGIN, una reversión completa aún puede deshacer el trabajo pendiente de la transacción.
Restricción
Una restricción es una regla declarada de la base de datos que comprueba los datos insertados o actualizados y rechaza un cambio que la infringiría.
Una comprobación del precio de un producto rechaza un importe negativo con independencia de la aplicación que envíe la escritura.
Restricción con nombre
Una restricción con nombre tiene un identificador elegido que ayuda a localizar la regla en los mensajes de error y a hacer referencia a ella en cambios de estructura posteriores.
CONSTRAINT price_positive CHECK (price > 0) asigna a la regla de precio positivo un nombre para su mantenimiento posterior.
RETURNING
Una cláusula RETURNING hace que una escritura devuelva valores elegidos de las filas afectadas, incluidos identificadores generados en PostgreSQL y versiones recientes de SQLite.
La inserción de un pedido puede devolver su identificador nuevo para que la siguiente inserción vincule las líneas de pedido con el pedido real.
ROLLBACK
La orden ROLLBACK deshace los cambios pendientes de la transacción actual y la termina, sin deshacer las transacciones confirmadas anteriormente.
Una eliminación sin confirmar que vacía la tabla de pedidos puede revertirse para restaurar sus filas originales.
ROLLBACK TO
La orden ROLLBACK TO deshace los cambios realizados después de un punto de guardado con nombre y deja abierta la transacción exterior para más trabajo o una decisión final.
Volver a un punto de guardado llamado after_first, establecido entre dos aumentos de saldo, elimina el aumento posterior, pero mantiene pendiente el anterior.
ROUND
La función ROUND solicita redondear a un número elegido de decimales y es útil cuando el almacenamiento no exige una escala decimal.
ROUND(price * 1.10, 2) solicita un resultado de dos decimales para un cálculo de precio en SQLite que produciría 21,989.

S

Subconsulta
Una subconsulta es un SELECT anidado dentro de otra sentencia que proporciona valores o filas que la sentencia exterior puede utilizar.
Una eliminación puede utilizar order_id IN (SELECT id FROM orders WHERE status = 'cancelled') para elegir las líneas relacionadas.

T

Tabla de preparación
Una tabla de preparación contiene temporalmente datos importados para poder inspeccionarlos y limpiarlos antes de copiarlos a su destino final con restricciones.
Las cadenas de correo importadas vacías o compuestas solo por espacios pueden convertirse en NULL mediante NULLIF(TRIM(email), '') durante la consulta de copia.
Tabla hija
Una tabla hija contiene una clave foránea que apunta a una tabla padre y vincula sus filas con registros referenciados existentes.
La tabla de pedidos es hija de clientes, mientras que las líneas de pedido pueden ser a su vez hijas de pedidos.
Tabla padre
Una tabla padre contiene la clave referenciada en una relación de clave foránea, por lo que sus filas coincidentes deben existir antes que las filas hijas dependientes.
La tabla de clientes es la padre cuando el identificador de cliente de cada pedido hace referencia a la clave primaria del cliente.
Tipo de datos
Un tipo de datos describe la clase de valores que almacena una columna y ayuda a determinar su comportamiento en comparaciones, ordenaciones y cálculos aritméticos.
Una cantidad utiliza un tipo numérico para calcular totales, mientras que un código postal estadounidense utiliza texto para conservar sus ceros iniciales.
Transacción
Una transacción agrupa sentencias en una unidad de trabajo cuyos cambios pendientes pueden conservarse juntos con COMMIT o deshacerse con ROLLBACK.
Una transferencia coloca su cargo y su abono dentro de una transacción para poder deshacer una transferencia incompleta.
Transacción fallida
Una transacción fallida de PostgreSQL resulta de un error de sentencia y rechaza las órdenes normales hasta una reversión o la recuperación a un punto de guardado anterior.
Tras una actualización de saldo rechazada, se rechaza otro SELECT hasta que se elimine el estado de transacción fallida.
TRUNCATE
La sentencia TRUNCATE vacía una tabla completa sin filtro WHERE en las bases de datos que la admiten; SQLite no dispone de ella.
Una tabla de PostgreSQL puede vaciarse con TRUNCATE TABLE, pero sus reglas de dependencias y transacciones siguen importando.

U

UNIQUE
Una restricción UNIQUE impide repetir valores no ausentes o combinaciones de valores, con un comportamiento ante valores ausentes que depende de la base de datos.
UNIQUE (order_id, product_id) permite el mismo producto en pedidos distintos, pero rechaza un par repetido.
UPDATE
La sentencia UPDATE asigna valores nuevos a columnas de filas existentes y elige sus filas de destino con una condición WHERE opcional.
UPDATE products SET price = 22.50 WHERE id = 3; modifica un producto sin insertar una fila de producto nueva.

Sobre esta unidad

Por StudeliInformar de un error

Crea tus propios Materiales de Estudio

Convierte tus notas, diapositivas y documentos en Guías de Estudio, Preguntas de Práctica, Flashcards y 6 herramientas más.

Comenzar