Crear tablas con relaciones lógicas en MySQL
Clase 9 de 24 • Curso de SQL y MySQL 2018
Contenido del curso
Clase 9 de 24 • Curso de SQL y MySQL 2018
Contenido del curso
Karla Daniela del Refugio Romero Cidón
Jhonwil Abraham González Pérez
Cristian Blandon
Angel de Jesus Quintero Pereira
Fredy Mendoza Vargas
David Amador Morales
Javier Romero
José Oporto Muñoz
Andrés Fernández
Armando Tacza
Manuel Rivera
Sebastian CA
Sergio Galaz
Luis Miguel Gil Torres
Dylan leonardo
Christian Arturo Rios Mock
Javier Ramos
Facundo Nicolás García Martoni
Buzu B
David De la Cruz
Jeyson David Vargas Crespo
Usuario anónimo
Fernando Antonio Berrocal Vergara
Manuel Rivera
Samuel Marin
Sebastián Pineda Duque
Maria Lopez
Mauricio Ernesto Rivas Baños
David De la Cruz
Sergio Andrés Pachón Dotor
Paula Andrea Sierra Alba
Paula Andrea Sierra Alba
Ricardo Rodriguez Otero
José Luis Quiróz Casas
Diego Luis Giraldo Castillo
Yon cayllahua utani
RODRIGO ALEJANDRO CASTILLO MONTERROSA
Daniel Alejandro Romero Chavez
Iván Darío Sánchez Jiménez
Juan Andrade
Reinaldo Mendoza
Aaron Contreras Garibay
Jorge Rivadeneira Cevallos
Daniel Andrés Giraldo Benites
Oscar Reyes
Erick Armando Sánchez Flores
Damián Valenzuela Negrete
Hola, yo cree mi tabla de books diferente, ya que en la columna author_id como en realidad hace referencia a otra tabla. En realidad se trata de una foránea, al momento de crear las tablas como puedes definir o identificar una columna como llave primaria (PRIMARY KEY) también se pueden identificar ciertas columnas como llaves foráneas (FOREIGN KEY) ya que se relacionan con otra tabla. Si quieren saber más del tema de las llaves foráneas pueden investigar un poco más.
Les comparto como creé mis tablas.
Saludos!!
Lo recomendable es crear el FOREING KEY luego de la creación de la tabla (con la sentencia ALTER TABLE), esto debido a que algunas veces al momento de crear la tabla y crear la llave foránea se referencia hacia una tabla que aún no existe (puede ser debido a que el código esta más abajo )esto nos dará un error. Por ello recomiendo usar alter table. Ejemplo:
CREATE TABLE table1 IF NOT EXISTS ( same_id INTEGER PRIMARY KEY AUTO_INCREMENT same_fk INTEGER, other VARCHAR, FOREING KEY (same_fk) REFERENCES table2 (same_id) ); CREATE TABLE table2 IF NOT EXISTS ( same_id INTEGER PRIMARY KEY AUTO_INCREMENT );
En este punto va haber un error debido a que al momento de hacer la referencia de same_fk ,en ese punto aun no existe table2. Solución crear las tablas y luego alterarlas para darle el FK (ALTER TABLE).
Saludos …
No me parece en lo absoluto que haya problema, teniendo en cuenta que la compañera primero crea la tabla independiente, y luego la dependiente.
De repente agregarías más valor si compartes cómo hacerlo bien (desde tu punto de vista) y no cómo está mal hecho.
¡Saludos!
7- Tipos de columnas / Creación de la tabla authors
La tabla de bases datos como se comentó anteriormente necesitan una PRIMARY KEY osea un “id” para identificar los registros.
Es buena práctica: MySQL permite minúsculas y mayúsculas en el nombre de tablas y sentencias sql, pero es recomendable colocar en mayúsculas las sentencias(palabras reservadas) sql y todo lo relaciona con lo propio de MySQL y en minúscula el nombre de tablas y columnas.
Como la relación entre tablas es lógica y se realiza mediante los id, en la tabla en donde se referencia la columna debe ser del mismo tipo de datos.
El error vs Warnings: la diferencia entre estos dos es que el error rompe cualquier flujo de trabajo que tengamos en nuestra aplicación mientras que el warnnigs nos muestra una advertencia que no rompe el flujo de trabajo workflow.
DROP TABLE name_table; borra la estructura de la tabla de bases de datos y su contenido
DESCRIBE name_table; muestra la estructura de nuestra tabla. Nos muestra las columnas: field, type, Null, Key, Default, Extra.
DESC name_table; es un acrónimo de describe que realiza la misma función de describir la estructura de la tabla.
SHOW FULL COLUMNS FROM name_table; Esta función describe la estructura de la bases de datos incluyendo más información cómo: field, Type, Collation, Null, Key, Default, Extra, Privileges, comment.
Cuando queremos usar una palabra reservada del lenguaje como nombre de alguna columna lo colocamos encerrado entre comillas de acento ejemplo: year.
Creación de la tabla authors.
CREATE TABLE `authors` ( `author_id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(100) NOT NULL, `nationality` varchar(100) DEFAULT NULL, `active` TINYINT(1) NOT NULL DEFAULT 1, `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`author_id`), UNIQUE KEY `uniq_author` (`name`) ) ENGINE=InnoDB AUTO_INCREMENT=193 DEFAULT CHARSET=utf8;
-. DROP TABLE name_table; Es un instrucción que se utiliza para eliminar la estructura de una tabla junto con su información
/*Eliminar una tabla*/ DROP TABLE `authors`;
-.DESCRIBE name_table; Es una instrucción que se utiliza para describir la estructura de una tabla de forma resumida.
/*describe el contenido (columnas) las tabla book*/ DESCRIBE `books`;
-. SHOW FULL COLUMNS FROM name_table; Es una instrucción que se utiliza para describir la estructura de una tabla junto con sus comentarios y privilegios.
/*describe todo el contenido de la tabla, como: field, Type data, collaction, Null, key, Extra, Privileges, coment*/ SHOW FULL COLUMNS FROM `books`;
Gracias!
Gracias, buen aporte.
++esto es un aporte para los nuevos que ingresan a este curso:++ por favor escriban el mismo código del profesor de esta manera en la consola, para que no tengan problemas, por favor que este muy bien la sintaxis revisen bien antes de ejecutar o les aparecerá un error osea me refiero a que escriban muy bien, ahí les dejo la imagen espero les haya servido.
me sirvió mucho!!!
muchas gracias
Gracias, me sirvió también!!
mis apuntes de la clase :
//Creando una base de datos desde la consola CREATE DATABASE IF NOT EXISTS platzi_operation; //Seleccionando la Base de Datos para trabajar en ella USE platzi_operation; //Creacion de tablas dentro de la Base de Datos seleccionada CREATE TABLE IF NOT EXISTS books ( book_id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT, author_id INTEGER UNSIGNED, title VARCHAR(100) NOT NULL, `year` INTEGER UNSIGNED NOT NULL DEFAULT 1900, language VARCHAR(2) NOT NULL DEFAULT 'es' COMMENT 'ISO 639-1 Laguage', cover_url VARCHAR(500), price DOUBLE(6,2) NOT NULL DEFAULT 10.0, sellable TINYINT(1) DEFAULT 1, copies INTEGER NOT NULL DEFAULT 1, description TEXT ); CREATE TABLE IF NOT EXISTS authors ( author_id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT, name VARCHAR(100) NOT NULL, nationality VARCHAR(3) );```
En mi caso vengo del curso de fundamentos de db, donde se dice que se debe establecer una relación por medio de una llave foránea, así que dejo el código.
ALTER TABLE `platzi_operation`.`books` ADD CONSTRAINT `author_id` FOREIGN KEY (`author_id`) REFERENCES `platzi_operation`.`authors` (`author_id`) ON DELETE NO ACTION ON UPDATE CASCADE;```
Skeleton of an alter for a foreign key:
ALTER TABLE <db>.<main_table> ADD CONSTRAINT <main_table_column> FOREIGN KEY <main_table_column> REFERENCES <db>.<to_reference_table>(<to_reference_field>) ON DELETE <action> ON UPDATE <action>;
Les comparto mi codigo para que no les aparescan esos 2 warnings
CREATE TABLE IF NOT EXISTS books ( book_id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, author_id INT UNSIGNED, title VARCHAR(100) NOT NULL, year INT UNSIGNED NOT NULL DEFAULT 1900, language VARCHAR(2) NOT NULL DEFAULT 'es' COMMENT 'ISO 639-1 Language', cover_url VARCHAR(500), price DOUBLE NOT NULL DEFAULT 10.0, sellable TINYINT DEFAULT 1, copies INT NOT NULL DEFAULT 1, description TEXT );```
Excelente aporte!
excelente bro, muchas gracias, los erroes que me salian me estaban volviendo loco y no se que hice mal
No me complique tanto la vida, estoy utilizando Mysql Worbench y funciona de la misma menera que la termnial
La consola no complica la vida es mas con el tiempo la simplifica
Sí, funciona correctamente cuando trabajas en tu máquina local, pero cuando administres un servidor (donde están las bases de datos en el mundo real) no tendrás otra opción que realizar ajustes mediante SSH en la consola.
Cuando las filas ocupan más de un reglón, puedes terminar el comando con \G en lugar de ; para que las filas se muestren en formato vertical.
La verdad que es muy útil terminal con \G queda hasta cool :-)
*************************** 5. row *************************** Field: language Type: varchar(2) Collation: utf8mb4_0900_ai_ci Null: NO Key: Default: es Extra: Privileges: select,insert,update,references Comment: ISO 639-1 Language
Que buen dato el de \G
No se deberia especificar authors_id como Foreign Key? en la tabla de books
Pienso que sí debería ser como dices, para que no haya confusión.
Vengo del curso de fundamentos de bases de datos y es lo que se explica allí, para establecer una relación entre tablas es mejor la llave foránea, en cuestion de rendimiento no sé.
Por qué no usa Foreign Key en author_id cuando crea la tabla books? Se enlazan sin tener que usarla? No veo como hace referencia al author_id sin tener que indicarle tabla y campo de authors.
Me hago la misma pregunta 😕
No, no estan enlazadas aqui todavia no hace el enlace, lo va a hacer despues.
tener en cuenta.
| Warning | 1681 | Specifying number of digits for floating point data types is deprecated and will be removed in a future release. | | Warning | 1681 | Integer display width is deprecated and will be removed in a future release.
A mí también me han aparecido esos warnings al crear la tabla books pero no se que significan.
Esos warnings significan:
AQUÍ EL RESULTADO DEL RETO UNOS CONSEJOS : 1.)SIEMPRE TRATEN DE ESPECIFICAR SI EL CAMPO ES FK O PK SOLO COMO BUENAS PRÁCTICAS 2.) LAS BASES DE DATOS CASI SIEMPRE LAS ESCRIBO CON MAYÚSCULA PARA QUE AL MOMENTO DE HACER CONEXIÓN NO ME EQUIVOQUE CON LOS CAMPOS. 3.) SIEMPRE ANTES DE REALIZAR UNA BASE DE DATOS DEBEN REALIZAR UN MODELADO DE LA MISMA CASI SIEMPRE SE REALIZA 1_MER (MODELO ENTIDAD RELACION) 2_MR (MODELO RELACIONAL)
4.) CADA DATO QUE TENGA UNA TABLA SIEMPRE TRATEN DE ESPECIFICAR DE QUE TABLA VIENE EJ: EN LA TABLA CLIENTES Y BOOKS TENEMOS UN ESTADO (ACTIVO O INACTIVO) LO MÁS CONVENIENTE SERÍA DECLARARLOS ASÍ STATE_CLIENT TINYINT(1) DEFAULT 1 NOT NULL STATE_BOOK TINYINT(1) DEFAULT 1 NOT NULL PARA ASÍ ESPECIFICAR DE QUE TABLA SE ESTÁ HABLANDO
CREATE TABLE OPERATIONS ( OPERATIONS_ID INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT NOT NULL, BOOK_ID_FK INTEGER UNSIGNED NOT NULL, TYPE_OPERATIONS ENUM('RENTADO','COMPRADO','DEVUELTO') NOT NULL, CLIENT_ID_FK INTEGER UNSIGNED NOT NULL, DATE_OPERATION DATETIME NOT NULL, CREATE_AT_OPERATIONS TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP NOT NULL, UPDATE_AT_OPERATIONS TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP NOT NULL, STATE_OPERATIONS TINYINT(1) DEFAULT 1 NOT NULL, FINISH_OPERATION TINYINT(1) NOT NULL, FOREIGN KEY (BOOK_ID_FK) REFERENCES BOOKS (ID_BOOK), FOREIGN KEY (CLIENT_ID_FK) REFERENCES CLIENTS (ID_CLIENT) );
EN EL PRIMERO PUNTO NO ES TANTO COMO BUENAS PRÁCTICAS SINO UN CONCEPTO QUE ES CARDINALIDAD! :)
Muy buenas recomendaciones y tienes razón uno antes de tirar código se debería saber como se van a relacionar las tablas y creo que una de las carencias de este curso es que las ultimas versiones de MySQL ya viene con un diseñador de modelos y no se usa ...
para limpiar pantalla en la consola de mysql en windows : “system cls”
En la actual versión de mysql (8.0), arrojará los siguientes warnings: | Warning | 1681 | Specifying number of digits for floating point data types is deprecated and will be removed in a future release. | | Warning | 1681 | Integer display width is deprecated and will be removed in a future release.
CREATE TABLE IF NOT EXISTS books ( book_id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT, author_id INTEGER UNSIGNED, title VARCHAR(100) NOT NULL, 'year' INTEGER UNSIGNED NOT NULL DEFAULT 1900, 'lenguage' VARCHAR(2) NOT NULL DEFAULT 'es' COMMENT 'ISO 639-1 Language', 'cover_url' VARCHAR(500), price DOUBLE(6,2) NOT NULL DEFAULT 10.0, sellable TINYINT(1) DEFAULT 1, copies INTEGER NOT NULL DEFAULT 1, description TEXT );
CREATE TABLE IF NOT EXISTS authors ( author_id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT, 'name' VARCHAR(100) NOT NULL, nationality VARCHAR(3) );
Una forma mas fácil de crear las llaves foráneas, es cuando estamos creando el campo que será la llave foránea.
Pasaríamos de esto…
author_id INTEGER NOT NULL, FOREIGN KEY (author_id) REFERENCES authors(author_id)
a esto…
author_id INTEGER NOT NULL REFERENCES authors(author_id)
y nos ahorramos una linea de código 😉
En cuanto a la definición de la BD el mas lineas o menos no lo hace mas optimo, en un procedure es discutible.
La recomendación que me parece mas idónea es utilizar la sentencia alter después de la creación de las tablas para evitar errores producidos por el orden de creación de las tablas.
Tiene razón croweloper, luego de almacenar datos si queremos exportar la base de datos a otro SGBD, es importante que esta tenga las llaves foraneas al final para evitar errores en el flujo de ejecución del script por temas de integridad referencial
Para los que le sale warnings, es por los parentesis despues de los tipos de datos numericos, al parecer ya no hace falta especificarlos, en futuras versiones ya no se hará uso del mismo. 😃
CREATE TABLE IF NOT EXISTS books ( book_id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT, author_id INTEGER UNSIGNED, title VARCHAR(100) NOT NULL, year INTEGER UNSIGNED NOT NULL DEFAULT 1900, language VARCHAR(2) NOT NULL DEFAULT 'es' COMMENT 'ISO 639-1 Language', cover_url VARCHAR(500), price DOUBLE NOT NULL DEFAULT 10.00, sellable TINYINT DEFAULT 1, copies INTEGER NOT NULL DEFAULT 1, descripcion TEXT );
Interesante, gracias por el aporte
código para crear tablas funcionando:
books
create table if not exists books ( `book_id` integer unsigned primary key auto_increment, -- unique id per transaction `author_id` integer unsigned, `title` varchar(100) not null, `year` integer unsigned not null default 1900, `language` varchar(2) not null default 'es' comment 'ISO 639-1 Language', `cover_url` varchar(500), `price` double(6, 2) not null default 10.00, -- (total_numbers, decimal_numbers) in this case the result is XXXX.YY `sellable` tinyint(1) default 1, `copies` integer unsigned not null default 1, `description` text );
authors:
create table if not exists authors( `author_id` integer unsigned primary key auto_increment, `name` varchar(100) not null, `nationality` varchar(3) );
Notas en 2022:
Está muy aburrido éste curso.
Vengo del curso de fundamentos y no es tanto que este aburrido, sino que esta planteado con una orientación mas hacia uso sql en terminal. A mi me parece que complementa excelente al curso de fundamentos, te animo que lo revises primero y regreses ;)
Para usar una palabra reservada en el nombre de una columna debemos usar la comilla (`) de esta forma:
`nombre_columna`
Por ejemplo si queremos usar year, date…
Cual es la combinacion de teclas para poner ese caracter? :)
ALT + 96