Dominar la creación de tablas en SQL es fundamental para desarrollar bases de datos eficientes y adaptadas a requerimientos específicos de negocio. SQL es un lenguaje intuitivo basado en comandos en inglés, como por ejemplo, create, que permite crear tablas de manera sencilla y natural. En este contenido vamos a profundizar en la creación de tablas con relaciones claras entre ellas, considerando prácticas recomendadas para evitar errores en la gestión de bases de datos.
¿Cómo crear correctamente una tabla en SQL?
Para crear tablas en SQL, usamos el comando CREATE TABLE. Una práctica común es verificar primero si la tabla existe con la cláusula IF NOT EXISTS, de esta forma:
Esta relación obliga a que los valores de clientID en la tabla bills existan como valores en clientID de la tabla clients.
¿Qué ocurre cuando se modifica o elimina una entrada relacionada?
Para prevenir errores al actualizar o borrar valores de identificación, se recomienda usar restricciones como ON UPDATE CASCADE o ON DELETE CASCADE. La inclusión sería de esta forma:
Dato curioso jóvenes, la razón por la que en bill_id aparece dos a pesar de que la primera query falló, es un comportamiento normal en las columnas AUTO_INCREMENT en sql, ya que aunque haya fallado la query el contador interno cuenta la query fracasada.
Recordemos que: Un trigger (o disparador) es un objeto que se ejecuta automáticamente cuando ocurre un evento específico en una tabla o vista, como una inserción, actualización o eliminación de datos.
Gracias, creo que el profe a veces se pone en modo automático y se olvida de los que no sabemos de SQL
Durante la clase se presentaron errores relacionados con la integridad referencial en SQL. Por ejemplo, al intentar insertar una fila en la tabla bills con un client ID que no existía en la tabla clients, se generó un error de restricción de clave foránea. Este tipo de error ocurre porque el diseño de la base de datos exige que cada bill tenga un client ID que ya esté registrado.
Otro error fue al intentar actualizar un client ID que ya estaba referenciado en bills, lo cual también es violado por la restricción de la clave foránea. Esto resalta la importancia de mantener la integridad entre las tablas relacionadas.
En la clase se abordaron varios comandos importantes de SQL relacionados con la creación de tablas. Aquí algunos de los más relevantes:
CREATE TABLE: Este comando se utiliza para crear una nueva tabla en la base de datos.
Gracias tabmien me dio 3780 y con el UNSIGNED , se resolvio
porque en la clase al profesor no le da el error?
Para usarios que utilizan MYSQL desde terminal
comando para limpiar pantalla
system cls; 👈🏼👈🏼👈🏼
Lamentablemente no me funciona;
Tambien pueden instalar mysql en el perfil de ubuntu de windows terminal, así estaran usando mysql desde una terminal linux. Me parece más cómodo así.
Les dejo por aqui el codigo de esta clase
CREATE TABLE IF NOT EXISTS clients( client_id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(100) NOT NULL, email VARCHAR(100) NOT NULL UNIQUE, phone_number VARCHAR(15), create_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);
CREATE TABLE IF NOT EXISTS products( product_id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(100) NOT NULL, slug VARCHAR(200) NOT NULL UNIQUE, description TEXT, create_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);
CREATE TABLE IF NOT EXISTS bills( bill_id INT PRIMARY KEY AUTO_INCREMENT, client_id INT NOT NULL, total FLOAT, status ENUM('open', 'paid', 'lost') NOT NULL DEFAULT 'open', create_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY (client_id) REFERENCES clients(client_id) ON DELETE CASCADE ON UPDATE CASCADE);
me pierdo mucho en estas clases, porque habla de procedimientos que aun no se el porque lo hace y porque ese procedimiento es mejor, hay un poco de enredo, lo digo segun mi punto de vista, debido a que no conozco nada de base de datos
Me imagino que no tienes nociones previas, no te desesperes; otros cursos de platzi, del mismo tema, explican conceptos que no se explican aquí y en conjunto vas "agarrando la onda"; también apoyate de otros recursos: tutotriales en youtube, redes sociales, AI...
A pesar q al definir el campo client_id como auto_increment en clients, cuando hacemos la insercion, colocamos un valor de 10 para este campo.
Me imagino q el autoincremt soporta esto y ya nos comimos los valores de 1 a 9? verdad? o se rellenaran igual a medida q automaticemos la captura de datos?
En pocas palabras: sí, estás en lo correcto.
La explicación más completa:
cuando asignas un valor a una columna auto_increment, mysql toma ese valor y actualiza la variable interna llamada AUTO_INCREMENT a ese valor y a partir de ese momento usa el valor de esta variable a la hora de necesitarla para crear nuevas tuplas.
Correcto, haciendo pruebas si pasamos como valor el 10 como id, el auto_increment lo tomará y el siguiente cliente creado, será el 11. Siempre y cuando no le pasemos algún client_id como parámetro.
Otra cosa que identifiqué es que si intentamos agregar un cliente que por ejemplo tenga el mismo correo que otro ya creado, esto generará error, al corregirlo, por alguna razón el auto_increment tomará el error como ejecutado y el client_id que le asignará será el siguiente numero.
A continuación una imagen que lo explica mejor.
Habrá alguna manera de evitar esto?
para los que les aparece ese error de que no son compatibles, es porque en mysql las llaves foraneas deben ser exactamente igual a su referencia por lo que a la hora de crear la tabla bills, client_id debe llevar el usigned tambien, les debe quedar asi
Para los que no les funcione el Control + L para limpiar pantalla.
Escriban:
system cls
gracias eso me sirvió mucho
Un tip para tener en cuenta los que trabajen con datos financieros:
Para datos financieros en SQL NO se recomienda FLOAT, en su lugar es mejor utilizar DECIMAL(oNUMERIC) de acuerdo al manejador de DB.
FLOAT y DOUBLE usan punto flotante binario, lo que introduce errores de precisión y en finanzas un centavo mal calculado = problemas.
ON DELETE CASCADE asegura que al eliminar un registro padre, todos sus registros hijos relacionados en otras tablas también se eliminen automáticamente. Esto mantiene la integridad de los datos, evitando registros huérfanos, pero debe usarse con precaución debido a su impacto destructivo.
APORTE
El campo SLUG es relevante en una tabla de productos porque actúa como un identificador textual único y legible para formar URLs amigables y autodescriptivas.
Esto es clave en campañas de marketing digital, ya que mejora la accesibilidad, la experiencia de usuario y la optimización SEO. Al ser único, garantiza que cada producto tenga una dirección web exclusiva y clara, facilitando su indexación por motores de búsqueda y su promoción en campañas comerciales.
En nombre del carácter utilizado para utilizar palabras reservadas como identificadores es "comillas invertidas" o "backticks".
Haciendo lo mismo en PostgreSQL. Con comentarios en inglés, alteraciones, creación del enum y triggers (a falta de la operación 'ON UPDATE' de MySQL):
Estructura de Datos Relacionales
Definición de tablas: Uso de CREATE TABLE para establecer columnas y tipos de datos.
Llaves Primarias (PRIMARY KEY): Identificadores únicos e inmutables para cada registro.
Llaves Externas (FOREIGN KEY): Establecen la integridad referencial vinculando tablas de forma lógica.
Integridad y Relaciones
Relaciones: Conectan registros mediante claves compartidas.
Restricciones: Garantizan que los datos sigan reglas estrictas al insertar o borrar.
¿Como puedo agregar un trigger a una tabla ya creada sin borrarla y crearla de nuevo?
Para agregar un trigger o modificar restricciones en una tabla que ya existe sin borrarla, utilizas el comando ALTER TABLE.
Para implementar el comportamiento de "cascada" puedes modificar la llave foránea existente:
Eliminar el constraint actual:
ALTER TABLE nombre_tabla DROP FOREIGN KEY nombre_de_tu_constraint;
Agregar de nuevo con la regla de cascada:
ALTER TABLE nombre_tabla ADD CONSTRAINT nombre_de_tu_constraint FOREIGN KEY (columna) REFERENCES tabla_padre(columna) ON DELETE CASCADE ON UPDATE CASCADE;
Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column. To disable safe mode, toggle the option in Preferences.
otra forma de usarlo para solucionar este ejercicio sin tener que desactivar el safe mode es simplemente señalar invocando "where" el client_id que estamos usando, en este caso 12
DELETE from clients
WHERE client_id=12;
gracias....... tenía ese error 1175
En caso que trabajes en supabase (o con postgres en otro entorno) puedes modificar la línea del enum de la siguiente manera:
CREATE TABLE if not exists "bills" (
bill_id BIGSERIAL primary key,
client_id integer not null,
total float,
<u>status text not null default 'open'</u>
<u>CHECK (status IN ('open', 'paid', 'lost')),</u>