:arrow_up: ir al inicio
Al crear tablas, podemos añadir restricciones (en ingles constraints) a las columnas para evitar que se ingresen datos que no cumplan ciertas condiciones.
son usados para especificar reglas para la data en una tabla. Las restricciones son usadas para limitar el tipo de data que puede ir dentro de una tabla. Esto asegura la presicion y fiabilidad de la data en una tabla.
Asegura que a la columna no se le pueda añadir un valor nulo.
En este ejercicio, aprenderemos la restriccion NOT NULL que impide valores nulos en una columna. POr ejemplo, al crear una tabla de personas con nombre y apellido, podemos hacer que el nombre sea obligatorio (no nulo) y el apellido opcional.
Para lograrlo, crearemos la tabla de la siguiente forma:
CREATE TABLE personas (
nombre TEXT NOT NULL,
apellido TEXT
)
Para agregar una restriccion, simplemente debemos especificarla con la columna
Para indicar las restricciones, utilizaremos una columna adicional llamada Cnstrains, en nuestros temagramas. Ejemplo con la tabla personas
| COLUMN | DATA TYPE | CONSTRAINTS |
|---|---|---|
| nombre | TEXT | NOT NULL |
| apellido | TEXT |
Pongamos a prueba nuestra restriccion con distintas consultas y observemos los resultados
| QUERY | RESULTADO |
|---|---|
INSERT INTO personas (nombre, apellido) VALUES ('Juan', 'Pérez'); |
Funciona |
INSERT INTO personas (nombre, apellido) VALUES (NULL, 'Pérez'); |
No funciona, error: NOT NULL constraint failed: personas.nombre |
INSERT INTO personas (apellido) VALUES ('Pérez'); |
No funciona, error: NOT NULL constraint failed: personas.nombre |
En resumen: en esta tabla que acabamos de crear podremos hacer un insert de una persona con nombre y sin apellido, pero no podremos ingresar una persona sin nombre
Ejercicio:
Crea una tabla llamada empleados con las siguientes columnas
| COLUMNA | TIPO DE DATO | RESTRICCIONES |
|---|---|---|
| nombre | TEXT | NOT NULL |
| apellido | TEXT |
Luego ingresa los siguientes datos:
CREATE TABLE EMPLEADOS (
nombre TEXT NOT NULL,
apellido TEXT
);
INSERT INTO EMPLEADOS (nombre, apellido)
VALUES ('Pedro', 'Pérez')
En SQL tambien es posible agregar la restriccion a una tabla ya creada. Supongamos que tenemos la siguiente tabla personas | COLUMNA | TIPO DE DATO | RESTRICCIONES | |———-|————–|—————| | nombre | TEXT | | | apellido | TEXT | |
y queremos agregarle la restriccion NOT NULL a la columna nombre. El problema es que en SQLite no podemos agregar restricciones directamente a una tabla existente.
En otros motores de bases de datos como PostgreSQL o MySQL si es posible agregar restricciones a tablas existentes.
Lo que tenemos que hacer es:
CREATE TABLE personas2(
nombre TEXT NOT NULL,
apellido TEXT
)
INSERT INTO personas2(nombre, apellido)
SELECT nombre, apellido
FROM personas;
DROP TABLE personas
ALTER TABLE personas2 RENAME TO personas;
Ejercicio: Se tiene una tabla llamadas patentes, con las siguientes columnas
| COLUMNA | TIPO DE DATO | RESTRICCIONES |
|---|---|---|
| patente | TEXT |
con la siguiente información | PATENTE | |———| | ABC123 | | ABC124 |
Se pide agregar una restriccion de not null a la columna patente
create table patentes2 (
patente TEXT NOT NULL
);
INSERT INTO patentes2(patente)
SELECT patente
FROM patentes;
DROP TABLE patentes;
ALTER TABLE patentes2 RENAME TO patentes
En SQLite borrar una restriccion tiene las mismas limitaciones que modificarla y el procedimiento es igual:
Ejercicio: Se tiene la tabla llamada personas con las siguientes columnas
| COLUMNA | TIPO DE DATO | RESTRICCIONES |
|---|---|---|
| nombre | TEXT | NOT NULL |
| apellido | TEXT | NOT NULL |
| edad | INTEGER |
Se pide borrar la restricción de NOT NULL de las columnas nombre y apellido:
CREATE TABLE personas2 (
nombre TEXT,
apellido TEXT,
edad INTEGER
);
INSERT INTO personas2(nombre, apellido, edad)
SELECT nombre, apellido, edad
FROM personas;
DROP TABLE personas;
ALTER TABLE personas2 RENAME TO personas;
Fragmento tomado de roadmap
Podemos añadir una restriccion NOT NULL a una tabla existente, usando ela declaracion ALTER TABLE. Sin embargo, primero debemos verificar que la columna no contenga valores NULL antes de añadir la restriccion NOT NULL
Aui tenemos un ejemplo:
ALTER TABLE Employees
MODIFY Address varchar(255) NOT NULL;
Este comando va a modificar la tabla Employees y configurar la columna Address como NOT NULL
Nota: en unos sistemas como PostgreSQL podemos usar el comando
ALTER TABLEseguido porSET NOT NULL
La restriccion de unicidad, o UNIQUE nos permite evitar duplicados en una columna especifica. Un caso muy popular de estas restricciones es evitar personas con el mismo correo electronico.
Para agregar una restriccion de UNIQUE simplemente tenemos que especificar la restriccion justo despues de especificar el tipo de dato. Por ejemplo:
CREATE TABLE personas (
nombre text
apellido text
email text UNIQUE
)
Pongamos a prueba nuestra restriccion con distintas consultas y observemos los resultados:
| QUERY | FUNCIONA |
|---|---|
| INSERT INTO personas (nombre, apellido, email) VALUES (‘Juan’, ‘Pérez’, ‘juan.perez@email.com’); | Funciona |
| INSERT INTO personas (nombre, apellido, email) VALUES (‘María’, ‘García’, ‘juan.perez@email.com’); | No funciona, error: UNIQUE constraint failed: personas.email |
| INSERT INTO personas (nombre, apellido, email) VALUES (‘Pedro’, ‘Pérez’, ‘pedro.perez@email.com’); | Funciona |
En resumen, en esta tabla que acabamos de crear, el correo electronico debe ser unico, no ingresar dos personas con el mismo correo electronico.
Ejercicio:
En este ejercicio, vamos a crear una tabla llamada productos con las siguientes columnas:
| COLUMNA | TIPO DE DATO | RESTRICCIONES |
|---|---|---|
| nombre | TEXT | NOT NULL |
| codigo | TEXT | UNIQUE |
| precio | REAL | NOT NULL |
Y luego vamos a ingresar los siguientes registros:
| NOMBRE | PRECIO | CODIGO |
|---|---|---|
| Camisa | 1000.00 | CAM-001 |
| Pantalón | 2000.00 | PAN-001 |
| Camisa XL | 1000.00 | CAM-002 |
Pista: para poder ingresar las dos queries requeridas, recuerda añadir punto y coma al final de cada una.
Si quieres probar un insert para observar el error puedes hacerlo con el código CAM-001.
CREATE TABLE productos (
nombre TEXT NOT NULL,
precio float NOT NULL,
codigo TEXT UNIQUE
);
INSERT INTO productos
VALUES
('Camisa', 1000.00, 'CAM-001'),
('Pantalón', 2000.00, 'PAN-001'),
('CAmisa XL', 1000.00, 'CAM-002');
UNIQUE a una tabla existentePara añadir una restriccion UNIQUE a una table existente debemos usar el comando ALTER TABLE.
Aqui la sintaxis:
ALTER TABLE table_name
ADD UNIQUE (column1, column2, ...);
Aqui, table_name es el nombre de la tabla donde vamos a definir la restriccion, y column1, column2 etc, son los nobres de las columnas incluidas en la restriccion.
Hasta ahora hemos trabajado con dos tipos de restricciones:
En este ejercicio aprederemos a utilizar la restriccion CHECK, que nos permite establecer una condicion que los valores de una columna se deben cumplir.
CHECKlimita el rango de valores que son colocados en una columna.
Aqui la sintaxis basica
CREATE TABLE table_name (
column1 datatype CONSTRAINT constraint_name CHECK (condition)
column2 datatype
Para agregar una restriccion de CHECK, simplemente tenemos que especifcar en la definicion de la columna proporcionando la condicion que debe cumplir el valor de la columna. Por ejemplo:
CREATE TABLE empleados (
nombre TEXT,
salario REAL CHECK (salario > 0)
);
Ejercicio: En este ejercicio vamos a crear una tabla llamada productos con las siguientes columnas:
| COLUMNA | TIPO DE DATO | RESTRICCIONES |
|---|---|---|
| nombre | TEXT | NOT NULL |
| precio | REAL | NOT NULL |
| stock | INTEGER | CHECK (stock >= 0) |
Luego, vamos a insertar los siguientes registros:
| NOMBRE | PRECIO | STOCK |
|---|---|---|
| Camisa | 1000.00 | 10 |
| Pantalón | 2000.00 | 5 |
| Camisa XL | 1000.00 | 3 |
Pista: para poder ingresar las dos queries requeridas, recuerda añadir punto y coma al final de cada una.
Si quieres probar un insert para observar el error puedes hacerlo ingresando un stock negativo.
CREATE TABLE productos (
nombre TEXT NOT NULL,
precio float NOT NULL,
stock integer CHECK (stock >= 0)
);
INSERT INTO productos
VALUES
('Camisa', 1000.00, 10),
('Pantalón', 2000.00, 5),
('Camisa XL', 1000.00, 3)
Si queremos aplicar CHECK a multiples columnas:
CREATE TABLE employees (
ID int NOT NULL,
Age int,
Salary int,
CONSTRAINT chk_person CHECK (Age >= 18 AND Salary>=0)
Tambien es posible usar el comando ALTER TABLEpara añadir una restriccion CHECK despues que la tabla fue creada
ALTER TABLE Employees
ADD CONSTRAINT CHK_EmployeeAge CHECK (Age >= 21 and Age <= 60)
La clave primaria, o en ingles PRIMARY KEY nos ayuda a identofocar de forma unica cada registro en una tabla. Esto lo hace impidiendo que se ingresen valores duplicados o nulos en la columna que es la clave primaria.
| ID | MONTO DE LA BOLETA | FECHA DE EMISION |
|---|---|---|
| 1 | 10.000 | 2021-10-01 |
| 2 | 12.000 | 2021-10-02 |
| 3 | 16.000 | 2021-10-03 |
Si dijeramos que el campo id es la clave primaria, entonces cada registro de la tabla tiene un valor unico para el campo id . Este id no podria ser nulo ni podria ser el mismo que el de otro registro.
Cuando tenemos una clave primaria, tenemos certeza que podemos buscar cualquier registro en la base de datos y luego modificarlo o eliminarlo, y no habrá ningun otro registro modificado o elominado que el seleccionado. Esto nos permite cuidar la integridad de los datos.
Podemos definir una clave primaria en SQL cuando creamos o modificamos una tabla.
CREATE TABLE Employees (
ID INT PRIMARY KEY,
NAME TEXT,
AGE INT,
ADDRESS CHAR(50)
);
Ejercicio: Crea una tabla llamada POSTS con las siguientes columnas:
| COLUMN NAME | DATA TYPE | CONSTRAINTS |
|---|---|---|
| id | INT | PRIMARY KEY |
| title | TEXT | |
| content | TEXT |
inserta los siguientes registros
| ID | TITLE | CONTENT |
|---|---|---|
| 1 | Introducción | ¡Bienvenido al mundo de la programación! |
| 2 | Primeros Pasos | Sumérgete en los conceptos básicos de la programación. |
| 3 | Temas Avanzados | Explora conceptos y técnicas avanzadas en programación. |
Pista: para poder ingresar las dos queries requeridas, recuerda añadir punto y coma al final de cada una.
Si quieres poner a prueba la clave primaria puedes intentar insertar un id nulo o un id que ya hayas ingresado.
CREATE TABLE POSTS (
ID INT PRIMARY KEY,
TITLE TEXT,
CONTENT TEXT
);
INSERT INTO POSTS
VALUES
(1, 'Introducción', '¡Bienvenido al mundo de la programación!'),
(2, 'Primeros Pasos', 'Sumérgete en los conceptos básicos de la programación.'),
(3, 'Temas Avanzados', 'Explora conceptos y técnicas avanzadas en programación.')
Los campos autoincrementales nos permite generar un valor unico de forma automatica, para cada registro que insertemos en una tabla
De esta forma si tenemos una tabla como la siguiente
| ID | MONTO DE LA BOLETA | FECHA DE EMISION |
|---|---|---|
| 1 | 10.000 | 2021-10-01 |
| 2 | 12.000 | 2021-10-02 |
| 3 | 16.000 | 2021-10-03 |
Podemos ingresar un nuevo registro sin tener que especificar el valor del campo id, y la base de datos se encargará de generar un valor unico para ese campo. Para lograrlo simplemente no incluimos el campo id en la query
Ejemplo:
INSERT INTO boletas (monto_de_la_boleta, fecha_de_emision)
VALUES
(20.000, '2021-10-04')
Luego si seleccionamos todos los registros de la tabla, veremos que el campo id del nuevo registro tiene un valor unico y mayor al de los registros anteriores.
| ID | MONTO DE LA BOLETA | FECHA DE EMISION |
|---|---|---|
| 1 | 10.000 | 2021-10-01 |
| 2 | 12.000 | 2021-10-02 |
| 3 | 16.000 | 2021-10-03 |
| 4 | 20.000 | 2021-10-04 |
Un campo definido como INTEGER(o INT) + PRIMARY KEY se convierte automaticamente en un campo autoincremental en SQLite.
Ejercicio:
Crea una tabla llamada usuarios con las siguientes columnas:
| COLUMNA | TIPO DE DATO | RESTRICCIONES |
|---|---|---|
| id | INTEGER | PRIMARY KEY |
| nombre | TEXT | NOT NULL |
| fecha_creacion | DATE |
Luego vamos a insertar los siguientes registros
| NOMBRE | FECHA_CREACION |
|---|---|
| Ana | 2024-01-01 |
| Gonzalo | 2024-01-02 |
| Juan | 2024-01-03 |
| María | 2024-01-04 |
Pista: No ingreses los ids, la base de datos se encargará de generarlos automáticamente.
CREATE TABLE USUARIOS (
ID INTEGER PRIMARY KEY,
NOMBRE TEXT NOT NULL,
FECHA_CREACION DATE
);
INSERT INTO USUARIOS (NOMBRE, FECHA_CREACION)
VALUES
('Ana', '2024-01-01'),
('Gonzalo', '2024-01-02'),
('Juan', '2024-01-03'),
('María', '2024-01-04')
Resultado:
| ID | NOMBRE | FECHA_CREACION |
|---|---|---|
| 1 | Ana | 2024-01-01 |
| 2 | Gonzalo | 2024-01-02 |
| 3 | Juan | 2024-01-03 |
| 4 | María | 2024-01-04 |
Cuando tenemos campos autoincrementales en una tabla e insertamos un nuevo registro con valor mas alto que el de la secuencia actual, la base de datos se encarga de actualizar la secuencia para que el siguiente registro tenga un valor al del registro que acabamos de insertar.
Por ejemplo, si tenemos una tabla con los siguientes registros:
| ID | NOMBRE |
|---|---|
| 1 | Ana |
| 2 | Gonzalo |
| 3 | Juan |
Luego insertamos un nuevo registro coin un id mayor al de la secuencuia actual:
INSERT INTO usuarios (id, nombre)
VALUES (10, 'María')
Y luego insertamos un nuevo registro sin especificar el id:
INSERT INTO usuarios (nombre)
VALUES ('Pedro')
Obtendremos la siguiente tabla
| ID | NOMBRE |
|---|---|
| 1 | Ana |
| 2 | Gonzalo |
| 3 | Juan |
| 10 | María |
| 11 | Pedro |
Ejercicio:
Crea una tabla llamada transacciones con las siguientes columna:
| COLUMNA | TIPO DE DATO | RESTRICCIONES |
|---|---|---|
| id | INTEGER | PRIMARY KEY |
| monto | REAL | NOT NULL |
| fecha | DATE |
Luego vamos a insertar los siguientes registros:
| ID | MONTO | FECHA |
|---|---|---|
| 1000.00 | 2024-01-01 | |
| 2000.00 | 2024-01-02 | |
| 3000.00 | 2024-01-03 | |
| 10 | 4000.00 | 2024-01-04 |
| 5000.00 | 2024-01-05 |
Importante: Al único campo que vamos a agregar un id de forma personalizada va a ser al cuarto registro, esto con el fin de observar la relación que se genera entre el campo incremental y como aumenta según el valor que insertemos.
CREATE TABLE TRANSACCIONES (
ID INTEGER PRIMARY KEY,
MONTO FLOAT NOT NULL,
FECHA DATE
);
INSERT INTO TRANSACCIONES (MONTO, FECHA)
VALUES
(1000.00, '2024-01-01'),
(2000.00, '2024-01-02'),
(3000.00, '2024-01-03');
INSERT INTO TRANSACCIONES (ID, MONTO, FECHA)
VALUES
(10, 4000.00, '2024-01-04');
INSERT INTO TRANSACCIONES (MONTO, FECHA)
VALUES
(5000.00, '2024-01-05');
Resultado:
| ID | MONTO | FECHA |
|---|---|---|
| 1 | 1000 | 2024-01-01 |
| 2 | 2000 | 2024-01-02 |
| 3 | 3000 | 2024-01-03 |
| 10 | 4000 | 2024-01-04 |
| 11 | 5000 | 2024-01-05 |
La clave primaria no está limitada exclusivamente a valores numericos, tambien se pueden tilizar datos de texto. Tomemos, por ejemplo, una tabla de personas, donde podriamos emplear la direccion de correo electronico como la clave primaria, ya que cada individuo posee una direccion de correo única.
En SQLite, los campos que son de tipo INTEGER y se designan como PRIMARY KEY no pueden contener valores nulos. No obstante, a diferencia de otros sistemas de gestion de bases de datos como MySQL o POstgreSQL cuando se utiliza PRIMARY KEY con tipos de datos como texto u otros, se permite que el valor sea nulo.
POr lo tanto, si queremos que un campo sea tanto clave primaria como no nulo, debemos especificarlo metemante la combinacion de PRIMARY KEY y NOT NULL
Ejemplo:
CREATE TABLE posts (
title TEXT PRIMARY KEY NOT NULL
)
Ejercicio:
Crea una tabla llamada personas con las siguientes columnas:
| COLUMN NAME | DATA TYPE | CONSTRAINTS |
|---|---|---|
| TEXT | PRIMARY KEY NOT NULL | |
| nombre | TEXT | |
| apellido | TEXT |
Inserta los siguientes registros:
| NOMBRE | APELLIDO | |
|---|---|---|
| example1@example.com | John | Doe |
| example2@example.com | Jane | Smith |
| example3@example.com | Mike | Johnson |
Puedes probar usando el mismo email en dos registros diferentes para que observes como se comporta la restricción.
CREATE TABLE PERSONAS (
EMAIL TEXT PRIMARY KEY NOT NULL,
NOMBRE TEXT,
APELLIDO TEXT
);
INSERT INTO PERSONAS
VALUES
('example1@example.com', 'John', 'Doe'),
('example2@example.com', 'Jane', 'Smith'),
('example3@example.com', 'Mike', 'Johnson')
Una clave Foránea (Foreign Key) es usada para enlazar dos tablas juntas. Es una restriccion que se le puede agregar a una columna de una tabla para indicar que los valores que se inserten en esa columna deben existir en otra tabla. Por ejemplo: si tenemos una tabla de personas y una tabla de autos, podriamos agregar una columna personas_id a la tabla de autos, y agregarle la resticcion de clave foránea, para indicar que el valor de esa columna debe existir en la tabla de personas. De esta forma nos aseguramos que no se inserten autos de personas que no existen o que se borren personas que tienen autos asignados a su nombre, dejando autos sin dueño.
personas | COLUMNA | TIPO DE DATO | RESTRICCIONES | |———-|————–|—————| | id | INTEGER | PRIMARY KEY | | nombre | TEXT | | | apellido | TEXT | |
autos
| COLUMNA | TIPO DE DATO | RESTRICCIONES |
|---|---|---|
| id | INTEGER | PRIMARY KEY |
| patente | TEXT | |
| persona_id | INTEGER | FOREIGN KEY (persona_id) REFERENCES personas(id) |
Con los siguientes datos:
personas | ID | NOMBRE | APELLIDO | |—-|——–|———-| | 1 | John | Doe | | 2 | Jane | Smith |
autos | ID | PATENTE | PERSONA_ID | |—-|———|————| | 1 | ABC123 | 1 | | 2 | DEF456 | 2 |
Podemos ver que el auto con patente ABC123 pertenece a la persona con el id 1, y el auto con patente DEF456 pertenece a la persona con el id 2. Adicionalmente, la clave foranea nos asegura que no podemos borrar la persona con el id 1, mientras que exista un aut con persona_id 1. De esta misma forma, no podremos insertar un auto con persona_id 3 ya que no existe una persona copn id 3
Para agregar una clave foranea a una tabla existente, debemos especificar la restriccion FOREIGN KEY seguida del nombre de la columna y la tabla a la que hace referencia y finalmente la columna de la tabla a la que hace referencia.
La sintaxis es la siguiente
ALTER TABLE nombre_tabla
ADD COLUMN nombre_columna tipo_dato REFERENCES nombre_tabla_referencia(nombre_columna_referencia)
Se ve complicado, pero veamos un ejemplo con las tablas personas y autos
ALTER TABLE autos
ADD COLUMN personas_id INTEGER REFERENCES personas(id)
La clave foránea debe hacer referencia a una columna que ya tenga una restriccion de clave primaria.
Otra sintaxis, extraida de roadmap.sh
ALTER TABLE child_table
ADD FOREIGN KEY (fk_column)
REFERENCES parent_table(parent_key_column)
Ejercicio:
Se tiene las tablas articulos y categorias con la siguiente estructura
articulos
| COLUMNA | TIPO DE DATO | RESTRICCIONES |
|---|---|---|
| id | INTEGER | PRIMARY KEY |
| nombre | TEXT | |
| precio | REAL |
Categorias
| COLUMNA | TIPO DE DATO | RESTRICCIONES |
|---|---|---|
| id | INTEGER | PRIMARY KEY |
| nombre | TEXT |
Se pide agregar una clave foránea a la tabla articulos para que la columna categoria_id haga referencia a la columna id de la tabla categorias.
ALTER TABLE articulos
ADD COLUMN categoria_id INTEGER REFERENCES categorias(id)
Los conceptos de clave primaria y clave foránea son fundamentales para el diseño de bases de datos y los ocuparemos tan frecuentemente que los abreviaremos PK (primary key) y FK (foreign key). Con la clave primaria podemos identificar de forma unica cada registro de una tabla, y con la clave foranea podemos relacionar dos tablas entre si y evitar que existan registros que no tengan una relacion valida.
A partir de ahora utilizaremos frecuentemente las abreviaciones (PK y FK). Tambien veremos que casi todas las tablas tendran una clave primaria. Esto se debe a que la clave primaria nos ayuda a mantener la integridad de los datos y nos permite identificar de forma unica cada registro de una tabla
Una practica comun en el diseño de base de datos es utilizar una columna llamada id como PK. Esta columna es de tipo INTEGER y tiene la resticcion PRIMARY KEY . Ademas, es comun que esta columna sea autoincremental, es decir, que el valor de la columna se incremente automaticamente cada vez que se inserta un registro nuevo. Pero esto no es una obigacion. Definir una clave primaria es una decision de diseño y en algunos casos puede ser mas conveniente utilizar otra columna como clave primaria.
Ejercicio:
Se tiene la tabla transacciones y la tabla usuarios con la siguiente estructura:
transacciones
| COLUMNA | TIPO DE DATO | RESTRICCIONES |
|---|---|---|
| id | INTEGER | PRIMARY KEY |
| monto | REAL | |
| usuario_id | INTEGER | FOREIGN KEY (usuario_id) REFERENCES usuarios(id) |
Usuraios
| COLUMNA | TIPO DE DATO | RESTRICCIONES |
|---|---|---|
| id | INTEGER | PRIMARY KEY |
| nombre | TEXT | |
| apellido | TEXT |
Con los siguientes datos: transacciones
| ID | MONTO | USUARIO_ID |
|---|---|---|
| 1 | 100 | 1 |
| 2 | 200 | 2 |
| 3 | 300 | 1 |
usuarios
| ID | NOMBRE | APELLIDO |
|---|---|---|
| 1 | John | Doe |
| 2 | Jane | Smith |
En este ejercicio primero intentaremos crear una transacción con un usuario que no existe para observar el error.
Intentaremos borrar un usuario que tiene transacciones asociadas para observar el error.
Luego eliminaremos nuestras consultas anteriores y modificaremos la tabla de transacciones para eliminar la clave foránea. Solo se debe eliminar la clave foránea, no la columna.
TIP: Esto requiere crear una tabla temporal, copiar los datos de la tabla original a la tabla temporal, borrar la tabla original, y renombrar la tabla temporal con el nombre de la tabla original.
Los puntos 1 y 2 son para observar que sucede. Para lograr la respuesta correcta tienes que realizar los puntos 3 y 4 en el editor.
-- Creamos una tabla copia
CREATE TABLE transacciones2(
id INTEGER PRIMARY KEY,
monto float,
usuario_id INTEGER
);
-- Insertamos los valores originales a la tabla copia
INSERT INTO transacciones2(id, monto, usuario_id)
SELECT *
FROM transacciones;
-- Eliminamos la tabla original
DROP TABLE transacciones;
-- Renombramos la tabla copia al nombre original
ALTER TABLE transacciones2 RENAME TO transacciones;
-- Colocamos todas las transcaciones con un valor de usuario_id 3
UPDATE transacciones
SET usuario_id = 3