🎃 Grandes descuentos en libros en línea, eformaciones y vídeos*. Código CALABAZA30. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. PHP y MySQL
  3. Construir una base de datos en MySQL
Extrait - PHP y MySQL Domine el desarrollo de un sitio web dinámico e interactivo (5ª edición)
Extractos del libro
PHP y MySQL Domine el desarrollo de un sitio web dinámico e interactivo (5ª edición) Volver a la página de compra del libro

Construir una base de datos en MySQL

Crear y eliminar una base de datos

La sentencia SQL CREATE DATABASE permite crear una nueva base de datos.

Sintaxis simplificada

CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] nombre_base 

nombre_base es el nombre de la nueva base de datos. Este nombre debe respetar las reglas para los nombres de objetos MySQL.

CREATE SCHEMA es equivalente a CREATE DATABASE.

Se produce un error si ya existe una base de datos con el mismo nombre y la cláusula IF NOT EXISTS no está presente.

Para crear una base de datos, es necesario el privilegio global CREATE.

Físicamente, una base de datos MySQL se materializa en un directorio que contiene los archivos correspondientes a las diferentes tablas de la base de datos.

La sentencia SQL CREATE DATABASE ofrece varias opciones que permiten especificar el juego de caracteres y la intercalación por defecto de la base de datos, o cifrar la base de datos (desde la versión 8.0.16).

Ejemplo

mysql> CREATE DATABASE biblio; 
Query OK, 1 row affected (0.00 sec) 

La sentencia SQL DROP DATABASE permite eliminar una base de datos.

Sintaxis

DROP {DATABASE | SCHEMA} [IF EXISTS] nombre_base 

DROP SCHEMA es equivalente a DROP DATABASE.

Se produce un error si no existe la base de datos y la cláusula IF EXISTS no está presente.

Para eliminar una base de datos, es necesario el privilegio global DROP.

La sentencia DROP DATABASE elimina todo, sin solicitar confirmación. ¡Hay que pensarlo dos veces...

Gestionar los usuarios y los privilegios

1. Visión de conjunto

En la instalación de MySQL, se crea automáticamente una cuenta de superusuario con el nombre root.

La cuenta root se reserva normalmente a la administración del servidor MySQL.

Como complemento a la cuenta root, es recomendable crear como mínimo una cuenta por aplicación y, si es necesario, una cuenta por usuario final de la aplicación. De esta manera, será posible gestionar con mayor precisión los privilegios otorgados a cada usuario/aplicación y limitar los riesgos ligados a la utilización de la cuenta root.

En MySQL, un usuario está identificado de manera única por la combinación de dos datos:

  • un nombre de usuario;

  • un nombre de host (o dirección IP) a partir del cual el usuario puede conectarse.

Cada pareja de usuario/host es considerada por MySQL como un usuario único que tiene una contraseña para conectarse (en algún caso ninguna) y privilegios. Un mismo usuario (en el sentido de un nombre de usuario dado) puede tener privilegios diferentes según el host a partir del cual se conecte.

Por lo tanto, la sintaxis utilizada para designar a un usuario es la siguiente:

nombre_usuario[@nombre_host] 

Para el nombre de host, el valor ’%’ significa «cualquier host»; es el valor predeterminado cuando no se especifica el nombre del host. El signo % también puede utilizarse como carácter comodín en el nombre del host o la dirección IP para especificar una lista de equipo (oheurtel@’%.olivier-heurtel.fr’) o un intervalo de direcciones IP (oheurtel@’192.168.1.%’). El nombre de usuario puede estar vacío (usuario anónimo).

Es posible tener un usuario nombre_usuario@’%’ que puede conectarse a partir de cualquier equipo con determinados privilegios y otro usuario nombre_usuario@ nombre_host con el mismo nombre, pero que puede conectarse a partir de un equipo con privilegios diferentes (por ejemplo, más restrictivos si el equipo es considerado como poco seguro, o menos restrictivos si el equipo es considerado como muy seguro.

Los datos sobre los usuarios y sus derechos se almacenan en la base de datos mysql:

Tabla

Contenido

user

Lista de los usuarios con sus privilegios globales (privilegios que se aplican al servidor MySQL y a todas las bases de datos del servidor)....

Administrar las tablas

1. Crear una tabla

La sentencia CREATE TABLE permite crear una nueva tabla.

Sintaxis simplificada

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] nombre_tabla 
(especificación_columna, 
... 
) 
[ENGINE|TYPE[=] motor] 
especificación_columna = 
   nombre_columna tipo_columna [opción_columna] 
opción_columna (primera posibilidad) = 
   [NOT NULL | NULL] [VISIBLE | INVISIBLE] [DEFAULT valor] | (expresión)] [AUTO_INCREMENT][[PRIMARY] KEY] [UNIQUE [KEY]]  
opción_columna (segunda posibilidad) = 
   [GENERATED ALWAYS] AS (expresión) [VIRTUAL | STORED] 
   [NOT NULL | NULL] [VISIBLE | INVISIBLE] [[PRIMARY] KEY] [UNIQUE [KEY]] 

Ejemplo simple

mysql> CREATE TABLE evento 
    ->   ( 
    ->   id INT, 
    ->   nombre VARCHAR(20) 
    ->   ); 
Query OK, 0 rows affected (0.00 sec) 
 
mysql> DESC evento; 
+--------+-------------+------+-----+---------+-------+ 
| Field  | Type        | Null | Key | Default | Extra | 
+--------+-------------+------+-----+---------+-------+ 
| id     | int         | YES  |     | NULL    |       | 
| nombre | varchar(20) | YES  |     | NULL    |       | 
+--------+-------------+------+-----+---------+-------+ 
2 rows in set (0.00 sec) 

El nombre de la nueva tabla debe respetar las reglas para los nombres de los identificadores de MySQL. De manera predeterminada, la tabla se almacena en la base de datos actual; el nombre de la tabla puede tener la forma nombre_base.nombre_tabla para almacenarla en otra base de datos.

La palabra clave TEMPORARY indica que la tabla es temporal. Una tabla temporal solo es visible en la conexión actual y es automáticamente eliminada cuando la transacción actual se termina. Dos conexiones diferentes pueden utilizar el mismo nombre de tabla temporal sin conflicto.

La cláusula...

Utilizar las restricciones y los índices

1. Clave primaria o única

a. Definición

Una clave primaria (o restricción de clave primaria) garantiza que no habrá nunca dos filas en la tabla con el mismo valor en la/s columna/s que compone/n la clave. Por otro lado, todas las columnas de la clave primaria son obligatorias (cláusula NOT NULL implícita para las columnas en cuestión). Solo se permite una clave primaria por tabla.

Una clave única (o restricción de clave única) garantiza que no habrá nunca dos filas en la tabla con el mismo valor en la/s columna/s que compone/n la clave. A diferencia de la clave primaria, las columnas que componen la clave única no son necesariamente obligatorias; para las columnas de la clave que no son obligatorias, varias filas pueden tener el valor NULL sin incumplir la restricción. Pueden utilizarse varias claves únicas por tabla.

Una clave primaria o única puede estar constituida por una sola columna o varias columnas.

En una inserción o una modificación, se produce un error si una clave (primaria o única) contiene un valor que ya existe en la tabla.

Las claves primarias y únicas son índices particulares que imponen una obligación de unicidad. El acceso mediante una clave primaria o única es, pues, eficaz.

b. Administración

Una clave primaria o única constituida por una sola columna puede definirse directamente en las opciones de la columna, en el CREATE TABLE, o en un ALTER TABLE ... {CHANGE|MODIFY} (véase la sintaxis de las diferentes sentencias en los apartados anteriores).

Si no, en términos generales, una clave primaria o única, monocolumna o multicolumna, puede declararse por medio de una cláusula específica de definición de restricción.

Sintaxis

[CONSTRAINT [nombre_restricción]] PRIMARY KEY (nombre_columna[,...]) 
[CONSTRAINT [nombre_restricción]] UNIQUE [INDEX|KEY] (nombre_columna[,...]) 

nombre_restricción es el nombre atribuido a la restricción. Para una clave primaria, este nombre es ignorado; una clave primaria se denomina obligatoriamente PRIMARY. Para una clave única, el nombre predeterminado de la restricción es igual al nombre de la primera columna de la clave, con un sufijo (_2), si es necesario, para respetar la unicidad.

La cláusula...

Utilizar vistas

1. Definición

Una vista es una consulta SELECT cuya definición se almacena con un nombre en la base de datos.

La vista no almacena datos; los datos presentados por la vista vienen de las tablas examinadas por la consulta de la vista.

Una vista se utiliza como una tabla. Ciertas vistas pueden utilizarse en sentencias de actualización (INSERT, UPDATE, DELETE) para modificar datos de tablas subyacentes. Para que una vista pueda ser utilizada en una actualización, es necesario que haya una relación de uno a uno entre las filas devueltas por la vista y las filas de la tabla subyacente. Una vista no puede utilizarse para una actualización si la consulta que la define contiene una de las siguientes construcciones:

  • Una cláusula DISTINCT.

  • Expresiones en la cláusula SELECT (prohíbe las sentencias INSERT pero no las sentencias UPDATE que modifican únicamente las columnas que no son calculadas).

  • Agregados, uniones, subconsultas en la cláusula SELECT (véase el capítulo Técnicas avanzadas con MySQL - Utilizar subconsultas).

Las vistas se utilizan principalmente para:

  • Facilitar el acceso a los datos: la consulta utilizada para definir la vista puede ser compleja e incluir, por ejemplo, combinaciones entre varias tablas. Las consultas que utilizan la vista son, así, más fáciles de escribir.

  • Mejorar la seguridad del acceso a los datos: la consulta utilizada para definir la vista puede ocultar columnas (columnas no seleccionadas en la cláusula SELECT o filas (cláusula WHERE que filtra los datos)....

Obtener información sobre las bases de datos

1. El comando SHOW

El comando SHOW propone numerosas variantes que permiten mostrar información sobre las bases de datos, las tablas, las vistas, etc.

Variante 1: mostrar una lista de objetos

SHOW TABLES [FROM nombre_base] [condición] 
SHOW DATABASES [condición] 
SHOW TRIGGERS [FROM nombre_base] [condición] 

Variante 2: mostrar la lista de las columnas o de los índices de una tabla

SHOW COLUMNS FROM nombre_tabla [FROM nombre_base] [condición] 
SHOW INDEX FROM nombre_tabla [FROM nombre_base] 

Variante 3: mostrar el orden de creación de un objeto

SHOW CREATE {DATABASE | SCHEMA} nombre_base 
SHOW CREATE FUNCTION nombre_función 
SHOW CREATE PROCEDURE nombre_procedimiento 
SHOW CREATE TABLE nombre_tabla 
SHOW CREATE TRIGGER nombre_trigger 
SHOW CREATE VIEW nombre_vista 

Variante 4: mostrar una lista de objetos con ciertas características

SHOW PROCEDURE STATUS [condición] 
SHOW FUNCTION STATUS [condición] 
SHOW TABLE STATUS [FROM nombre_base] [condición] 

Con

condición = LIKE 'patrón' | WHERE expresión 

El resultado del comando SHOW se muestra en forma de filas y columnas, como el resultado de una consulta SELECT. La mayor parte de los lenguajes que acceden a MySQL permiten tratar el resultado del comando SHOW de la misma manera que el resultado de una consulta SELECT.

La cláusula opcional condición permite filtrar el resultado del comando SHOW, bien mediante una expresión LIKE que se aplica implícitamente al nombre del objeto, bien mediante una cláusula WHERE que puede aplicarse a cualquier columna del resultado.

Ejemplo

mysql> SHOW COLUMNS FROM coleccion; 
+---------------+--------------+------+-----+---------+----------------+ 
| Field         | Type         | Null | Key | Default | Extra          | 
+---------------+--------------+------+-----+---------+----------------+ 
| id            | int          | NO   | PRI | NULL    | auto_increment | 
| nombre        |...

Exportar e importar una base de datos

La aplicación cliente mysqldump exporta una base de datos MySQL con la forma de un archivo («dump») que contiene las sentencias que permiten crear de nuevo la base de datos. Es una de las maneras posibles de hacer una copia de seguridad de una base de datos.

Sintaxis simplificada

mysqldump [-h host] [-u usuario] [-p[contraseña]] nombre_base 

Con

-h host

Host al que debe conectarse (equipo local predeterminado).

-u usuario

Nombre de usuario para la conexión (nombre del usuario actual del sistema operativo de manera predeterminada).

-p[contraseña]

Contraseña para la conexión (ninguna contraseña predeterminada). Si no se introduce en la línea de comandos, se solicitará de manera interactiva, como cualquier contraseña. Si se especifica la contraseña en la línea de comandos (lo que no se recomienda por razones de seguridad), no debe contener ningún espacio tras la opción -p.

nombre_base

Nombre de la base de datos para exportar.

mysqldump muestra el resultado en la salida estándar; para recuperar este resultado en un archivo, hay que utilizar un comando de redirección (> archivo).

Ejemplo

[root@xampp ~]# mysqldump -u root eni > dump-base-eni.sql 

Resultado (del archivo dump-base-eni.sql)

-- MySQL dump 10.13 Distrib 8.0.28, for Linux- (x86_64) 
-- 
-- Host: localhost     Database:...