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:...