{"id":1777,"date":"2024-08-03T08:18:10","date_gmt":"2024-08-03T06:18:10","guid":{"rendered":"https:\/\/blog.sutilweb.eu\/?page_id=1777"},"modified":"2024-08-03T08:18:11","modified_gmt":"2024-08-03T06:18:11","slug":"11-creacion-bds-y-tipos-en-sql","status":"publish","type":"page","link":"https:\/\/sutilweb.eu\/index.php\/lenguajes\/php\/poo-php\/11-creacion-bds-y-tipos-en-sql\/","title":{"rendered":"11. Creaci\u00f3n BDs y Tipos en SQL"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">En este cap\u00edtulo creamos una <strong>base de datos<\/strong> que nos sirva para entender bien todos los conceptos. Crearemos una <strong>base de datos<\/strong> que almacenar\u00e1 informaci\u00f3n acerca de series y pel\u00edculas. Para obtener toda la informaci\u00f3n de las pel\u00edculas que estemos agregando nos vamos a basar en un p\u00e1gina especializada denominada <a href=\"https:\/\/www.imdb.com\" target=\"_blank\" rel=\"noreferrer noopener\">www.imdb.com<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Lo que vamos a crear es un archivo en formato <strong>.<em>sql<\/em><\/strong> para definir la estructura de nuestra base de datos. Crearemos el esquema de nuestra base de datos. Lo vamos a llamar <em>peliculas_schema.sql<\/em>.<\/p>\n\n\n\n<!--more-->\n\n\n\n<h2 class=\"wp-block-heading\">Comentarios en SQL<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Podemos incluir comentarios en SQL de dos maneras distintas:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>2 guiones: &#8212; (no es recomendable)<\/li>\n\n\n\n<li>Comentarios en m\u00faltiples l\u00edneas (tipo CSS): \/* *\/<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Creando la base de datos<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Lo primero que incluimos en nuestro archivo ser\u00e1 la creaci\u00f3n de la <strong>base de datos<\/strong>, mediante la siguiente sintaxis.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Ejm<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">CREATE DATABASE IF NOT EXISTS peliculas;<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Ya&nbsp; que hemos creado la base de datos, tenemos que ir a la misma con el comando use.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Ejm<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">use peliculas;<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">El siguiente paso es crear nuestra primera tabla, que va a ser la tabla de pel\u00edculas. La sintaxis ser\u00eda la siguiente:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Ejm<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">DROP DATABASE IF EXISTS peliculas;\n\nCREATE DATABASE IF NOT EXISTS peliculas;\n\nUSE peliculas;\n\n\/* Tabla de datos *\/\nCREATE TABLE movies(\n&nbsp; &nbsp; imdb_id CHAR(9) PRIMARY KEY,\n&nbsp; &nbsp; title VARCHAR(80) NOT NULL,\n&nbsp; &nbsp; plot TEXT,\n&nbsp; &nbsp; author VARCHAR(100) DEFAULT 'Pending',\n&nbsp; &nbsp; actors VARCHAR(100) DEFAULT 'Pending',\n&nbsp; &nbsp; country VARCHAR(30) DEFAULT 'Unknown',\n&nbsp; &nbsp; premiere YEAR(4) NOT NULL,\n&nbsp; &nbsp; poster VARCHAR(150) DEFAULT 'no-poster.jpg',\n&nbsp; &nbsp; trailer VARCHAR(150) DEFAULT 'no-trailer.jpg',\n&nbsp; &nbsp; rating DECIMAL(2,1),\n&nbsp; &nbsp; genres VARCHAR(50) NOT NULL,\n&nbsp; &nbsp; status INTEGER UNSIGNED NOT NULL,\n&nbsp; &nbsp; category ENUM('Movie', 'Serie') NOT NULL\n);<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Los tipos de datos que estamos utilizando en esta sentencia son:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><em><strong>CHAR<\/strong><\/em>: contiene justo los caracteres que le ponemos entre par\u00e9ntesis.<\/li>\n\n\n\n<li><em><strong>VARCHAR<\/strong><\/em>: se adapta a los caracteres que utilice la sentencia, solo utiliza los que hayamos pasado en la sentencia.<\/li>\n\n\n\n<li><em><strong>TEXT<\/strong><\/em>: Puede contener caracteres ilimitados.<\/li>\n\n\n\n<li><strong><em>YEAR<\/em><\/strong>: Para indicar el a\u00f1o.<\/li>\n\n\n\n<li><strong><em>DECIMAL<\/em><\/strong>: Tiene dos argumentos, el valor de n\u00famero entero y el valor del n\u00famero decimal.<\/li>\n\n\n\n<li><strong><em>ENUM<\/em><\/strong>: Como argumentos les pasamos entre comillas los valores que puede adquirir dicho campo.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">La siguiente tabla que vamos a crear es la tabla status, que va a tener la siguiente sintaxis.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Ejm<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\/* Tabla Cat\u00e1logo *\/\nCREATE TABLE status(\n&nbsp; &nbsp; status_id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT,\n&nbsp; &nbsp; status VARCHAR(20) NOT NULL\n);<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">La siguiente tabla que crearemos ser\u00e1 la tabla para nuestros usuarios, cuya sintaxis ser\u00e1 la siguiente:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Ejm<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\/* Tabla de Usuarios *\/\nCREATE TABLE users(\n&nbsp; &nbsp; user VARCHAR(15) PRIMARY KEY,\n&nbsp; &nbsp; email VARCHAR(80) UNIQUE NOT NULL,\n&nbsp; &nbsp; name VARCHAR(100) NOT NULL,\n&nbsp; &nbsp; birthday DATE NOT NULL,\n&nbsp; &nbsp; pass CHAR(32) NOT NULL,\n&nbsp; &nbsp; role ENUM('Admin', 'User') NOT NULL\n);<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Aprender a leer los errores<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Es importante aprender a leer los errores, cuando nos salga alg\u00fan c\u00f3digo de error, mirar en Internet dicho c\u00f3digo para saber donde est\u00e1 el error.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Como relacionar unas tablas con otras<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Para ello tenemos que hacer uso de lo que se denominan llaves for\u00e1neas (foreign key). Por lo que en nuestra tabla pel\u00edculas le tenemos que agregar la llave for\u00e1nea de la siguiente manera:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Ejm<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\/* Tabla Cat\u00e1logo *\/\n CREATE TABLE status(\n &nbsp; &nbsp; status_id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT,\n &nbsp; &nbsp; status VARCHAR(20) NOT NULL );\n\n\/* Tabla de datos *\/\nCREATE TABLE movies(\n&nbsp; &nbsp; imdb_id CHAR(9) PRIMARY KEY,\n&nbsp; &nbsp; title VARCHAR(80) NOT NULL,\n&nbsp; &nbsp; plot TEXT,\n&nbsp; &nbsp; author VARCHAR(100) DEFAULT 'Pending',\n&nbsp; &nbsp; actors VARCHAR(100) DEFAULT 'Pending',\n&nbsp; &nbsp; country VARCHAR(30) DEFAULT 'Unknown',\n&nbsp; &nbsp; premiere YEAR(4) NOT NULL,\n&nbsp; &nbsp; poster VARCHAR(150) DEFAULT 'no-poster.jpg',\n&nbsp; &nbsp; trailer VARCHAR(150) DEFAULT 'no-trailer.jpg',\n&nbsp; &nbsp; rating DECIMAL(2,1),\n&nbsp; &nbsp; genres VARCHAR(50) NOT NULL,\n&nbsp; &nbsp; status INTEGER UNSIGNED NOT NULL,\n&nbsp; &nbsp; category ENUM('Movie', 'Serie') NOT NULL,\n&nbsp; &nbsp; FOREIGN KEY status REFERENCES status(status_id)\n);<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Creamos primero la tabla <em>status<\/em> ya que de otra manera la <strong>clave for\u00e1nea<\/strong> creada en la tabla <em>movies<\/em> no encuentra la tabla <em>status<\/em> y da error.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Aplicar restricciones<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Adicionalmente a las <strong>relaciones<\/strong> es importante aplicar <strong>restricciones<\/strong> a estas <strong>relaciones<\/strong>. Lo que vamos a decirle a nuestra tabla es que al eliminar queremos <strong>restricci\u00f3n<\/strong> y al actualizar queremos <strong>cascada<\/strong>, de la siguiente manera.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Ejm<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\/* Tabla de datos *\/\nCREATE TABLE movies(\n&nbsp; &nbsp; imdb_id CHAR(9) PRIMARY KEY,\n&nbsp; &nbsp; title VARCHAR(80) NOT NULL,\n&nbsp; &nbsp; plot TEXT,\n&nbsp; &nbsp; author VARCHAR(100) DEFAULT 'Pending',\n&nbsp; &nbsp; actors VARCHAR(100) DEFAULT 'Pending',\n&nbsp; &nbsp; country VARCHAR(30) DEFAULT 'Unknown',\n&nbsp; &nbsp; premiere YEAR(4) NOT NULL,\n&nbsp; &nbsp; poster VARCHAR(150) DEFAULT 'no-poster.jpg',\n&nbsp; &nbsp; trailer VARCHAR(150) DEFAULT 'no-trailer.jpg',\n&nbsp; &nbsp; rating DECIMAL(2,1),\n&nbsp; &nbsp; genres VARCHAR(50) NOT NULL,\n&nbsp; &nbsp; status INTEGER UNSIGNED NOT NULL,\n&nbsp; &nbsp; category ENUM('Movie', 'Serie') NOT NULL,\n&nbsp; &nbsp; FOREIGN KEY status REFERENCES status(status_id)\n&nbsp; &nbsp; &nbsp; &nbsp; ON DELETE RESTRICT ON UPDATE CASCADE\n);<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Para qu\u00e9 restringir y para qu\u00e9 cascada. Los posibles valores que pueden adquirir las cla\u00fasulas <strong><em>ON DELETE<\/em><\/strong> y <strong><em>ON UPDATE<\/em><\/strong> son:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><em>RESTRICT<\/em><\/strong>: Es el comportamiento por defecto, que impide realizar modificaciones que atentan contra la integridad referencial.<\/li>\n\n\n\n<li><strong><em>CASCADE<\/em><\/strong>: Borra los registros de la tabla dependiente cuando se borra el registro de la tabla principal (en un sentencia <strong><em>DELETE<\/em><\/strong>) o actualiza el valor de la clave secundaria cuando se actualiza el valor de la clave referenciada (en una sentencia <strong><em>UPDATE<\/em><\/strong>).<\/li>\n\n\n\n<li><strong><em>SET NULL<\/em><\/strong>: Establece a <strong><em>NULL<\/em> <\/strong>el valor de la clave secundaria cuando se elimina el registro en la tabla principal o se modifica el valor del campo seleccionado.<\/li>\n\n\n\n<li><strong><em>NO ACTION<\/em><\/strong>: Inhabilita el efecto de la restricci\u00f3n, permitiendo que se efect\u00fae el cambio en la base de datos.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">En la pr\u00e1ctica, con los valores que se suele trabajar es con <strong><em>RESTRICT&nbsp;<\/em> <\/strong>y con <strong><em>CASCADE<\/em><\/strong>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">B\u00fasquedas FULL TEXT<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Las b\u00fasquedas de tipo <strong><em>FULL TEXT<\/em><\/strong> es lo que permite hacer b\u00fasquedas tipo buscador como en <a href=\"https:\/\/google.es\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>Google<\/strong><\/a>. La sintaxis que se pone para incluir este tipo de sentencia es la siguiente.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Ejm<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">FULLTEXT KEY search(title, author, actors, genres)<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Los campos de tipo <strong><em>TEXT<\/em> <\/strong>no funcionan con este tipo de b\u00fasqueda. La tabla peliculas quedar\u00eda de la siguiente manera.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Ejm<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\/* Tabla de datos *\/\nCREATE TABLE movies(\n&nbsp; &nbsp; imdb_id CHAR(9) PRIMARY KEY,\n&nbsp; &nbsp; title VARCHAR(80) NOT NULL,\n&nbsp; &nbsp; plot TEXT,\n&nbsp; &nbsp; author VARCHAR(100) DEFAULT 'Pending',\n&nbsp; &nbsp; actors VARCHAR(100) DEFAULT 'Pending',\n&nbsp; &nbsp; country VARCHAR(30) DEFAULT 'Unknown',\n&nbsp; &nbsp; premiere YEAR(4) NOT NULL,\n&nbsp; &nbsp; poster VARCHAR(150) DEFAULT 'no-poster.jpg',\n&nbsp; &nbsp; trailer VARCHAR(150) DEFAULT 'no-trailer.jpg',\n&nbsp; &nbsp; rating DECIMAL(2,1),\n&nbsp; &nbsp; genres VARCHAR(50) NOT NULL,\n&nbsp; &nbsp; status INTEGER UNSIGNED NOT NULL,\n&nbsp; &nbsp; category ENUM('Movie', 'Serie') NOT NULL,\n&nbsp; &nbsp; FULLTEXT KEY search(title, author, actors, genres),\n&nbsp; &nbsp; FOREIGN KEY (status) REFERENCES status(status_id)\n&nbsp; &nbsp; &nbsp; &nbsp; ON DELETE RESTRICT ON UPDATE CASCADE\n);<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Resumen<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Esta es la sintaxis SQL que hemos generado hasta ahora.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Ejm<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\/*\nBase de datos de pel\u00edculas y series\n*\/\n\nDROP DATABASE IF EXISTS peliculas;\n\nCREATE DATABASE IF NOT EXISTS peliculas;\n\nUSE peliculas;\n\n\/* Tabla Cat\u00e1logo *\/\nCREATE TABLE status(\n&nbsp; &nbsp; status_id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT,\n&nbsp; &nbsp; status VARCHAR(20) NOT NULL\n);\n\n\/* Tabla de datos *\/\nCREATE TABLE movies(\n&nbsp; &nbsp; imdb_id CHAR(9) PRIMARY KEY,\n&nbsp; &nbsp; title VARCHAR(80) NOT NULL,\n&nbsp; &nbsp; plot TEXT,\n&nbsp; &nbsp; author VARCHAR(100) DEFAULT 'Pending',\n&nbsp; &nbsp; actors VARCHAR(100) DEFAULT 'Pending',\n&nbsp; &nbsp; country VARCHAR(30) DEFAULT 'Unknown',\n&nbsp; &nbsp; premiere YEAR(4) NOT NULL,\n&nbsp; &nbsp; poster VARCHAR(150) DEFAULT 'no-poster.jpg',\n&nbsp; &nbsp; trailer VARCHAR(150) DEFAULT 'no-trailer.jpg',\n&nbsp; &nbsp; rating DECIMAL(2,1),\n&nbsp; &nbsp; genres VARCHAR(50) NOT NULL,\n&nbsp; &nbsp; status INTEGER UNSIGNED NOT NULL,\n&nbsp; &nbsp; category ENUM('Movie', 'Serie') NOT NULL,\n&nbsp; &nbsp; FULLTEXT KEY search(title, author, actors, genres),\n&nbsp; &nbsp; FOREIGN KEY (status) REFERENCES status(status_id)\n&nbsp; &nbsp; &nbsp; &nbsp; ON DELETE RESTRICT ON UPDATE CASCADE\n);\n\n\/* Tabla de Usuarios *\/\nCREATE TABLE users(\n&nbsp; &nbsp; user VARCHAR(15) PRIMARY KEY,\n&nbsp; &nbsp; email VARCHAR(80) UNIQUE NOT NULL,\n&nbsp; &nbsp; name VARCHAR(100) NOT NULL,\n&nbsp; &nbsp; birthday DATE NOT NULL,\n&nbsp; &nbsp; pass CHAR(32) NOT NULL,\n&nbsp; &nbsp; role ENUM('Admin', 'User') NOT NULL\n);<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>En este cap\u00edtulo creamos una base de datos que nos sirva para entender bien todos los conceptos. Crearemos una base de datos&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":1735,"menu_order":10,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_uag_custom_page_level_css":"","footnotes":""},"class_list":["post-1777","page","type-page","status-publish","hentry"],"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false},"uagb_author_info":{"display_name":"Sutil Web","author_link":"https:\/\/sutilweb.eu\/index.php\/author\/sutilweb\/"},"uagb_comment_info":0,"uagb_excerpt":"En este cap\u00edtulo creamos una base de datos que nos sirva para entender bien todos los conceptos. Crearemos una base de datos...","_links":{"self":[{"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/pages\/1777","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/comments?post=1777"}],"version-history":[{"count":2,"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/pages\/1777\/revisions"}],"predecessor-version":[{"id":1779,"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/pages\/1777\/revisions\/1779"}],"up":[{"embeddable":true,"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/pages\/1735"}],"wp:attachment":[{"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/media?parent=1777"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}