Introducción
MySQL es un sistema de gestión de bases de datos relacional, multihilo y multiusuario con millones de instalaciones en el mundo. MySQL se desarrolla como software libre en un esquema de licenciamiento dual. Por un lado se ofrece bajo licencia GNU GPL y, por otro, para aquellas empresas que deseen incorporarlo en productos privativos se puede adquirir una licencia para este uso, puediendo incluir soporte y otros servicios profesionales.
Tanto el sistema de gestión como su herramienta visual MySQL Workbench permiten diseñar y gestionar bases de datos; y administrar conexiones, usuarios y sus permisos.
Características
- Ofrece portabilidad entre sistemas.
- Aprovecha multiprocesamiento gracias a su implementación multihilo.
- Soporta gran cantidad de tipos de datos para los campos.
- Dispone de APIs para muchos lenguajes (Python, C, C++, etc).
- Permite hasta 32 índices por tabla.
- Administra usuarios y contraseñas.
- Licencia Open Source: uso gratuito y código fuente modificable.
- Gestor ampliamente utilizado entre desarrolladores de aplicaciones para Internet.
- Infinidad de herramientas y librerías.
- Fácil instalación y configuración.
Instalar MySQL en Debian/Ubuntu
$ sudo apt update
$ sudo apt install mysql-server
Instalar MySQL Workblench
La instalación de MySQL Workblench es opcional:
$ sudo apt install mysql-workbench
Para iniciar MySQL Workblench:
$ mysql-workbench &
Obtener versión instalada
$ mysql -V
mysql Ver 14.14 Distrib 5.7.22, for Linux (x86_64) using EditLine wrapper
Establecer contraseña y opciones de seguridad
Establecer contraseña
El usuario root de GNU/Linux debe tener una contraseña:
$ sudo -s
$ passwd
(Escribir y repetir contraseña del root)
Configurar opciones de seguridad
Para configurar las opciones de seguridad ejecutar en la línea de comandos:
$ mysql_secure_installation
Securing the MySQL server deployment.
Connecting to MySQL using a blank password.
VALIDATE PASSWORD PLUGIN can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD plugin?
Press y|Y for Yes, any other key for No:
(Presionar N)
Please set the password for root here.
(Establecer contraseña)
New password: alejandro_2018
Re-enter new password: alejandro_2018
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.
Remove anonymous users? (Press y|Y for Yes, any other key for No) :
(Presionar N)
... skipping.
Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.
Disallow root login remotely? (Press y|Y for Yes, any other key for No) :
(Presionar N)
... skipping.
By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.
Remove test database and access to it? (Press y|Y for Yes, any other key for No) :
(Presionar N)
... skipping.
Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.
Reload privilege tables now? (Press y|Y for Yes, any other key for No) :
(Presionar Y)
Success.
All done!
Comprobar instalación de MySQL
$ systemctl status mysql.service
● mysql.service - MySQL Community Server
Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: en
Active: active (running) since Fri 2018-05-11 11:47:54 CEST; 14min ago
Process: 9385 ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/run/mysqld/my
Process: 9376 ExecStartPre=/usr/share/mysql/mysql-systemd-start pre (code=exit
Main PID: 9387 (mysqld)
Tasks: 29 (limit: 4915)
CGroup: /system.slice/mysql.service
└─9387 /usr/sbin/mysqld --daemonize --pid-file=/run/mysqld/mysqld.pid
may 11 11:47:53 ant-Lenovo-G500 systemd[1]: Starting MySQL Community Server...
may 11 11:47:54 ant-Lenovo-G500 systemd[1]: Started MySQL Community Server.
(Para salir presionar Q)
Otro modo de comprobar la instalación:
$ mysqladmin -p -u root version
Enter password: alejandro_2018
mysqladmin Ver 8.42 Distrib 5.7.22, for Linux on x86_64
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Server version 5.7.22-0ubuntu18.04.1
Protocol version 10
Connection Localhost via UNIX socket
UNIX socket /var/run/mysqld/mysqld.sock
Uptime: 19 min 50 sec
Threads: 1 Questions: 9 Slow queries: 0 Opens: 113 Flush tables: 1
Open tables: 106 Queries per second avg: 0.007
Otra opción más comprobando el estado del servicio mysql:
$ service mysql status
Permitir acceso remoto
Con el cortafuegos IPtables habilitado para permitir conectarse desde otro equipo a MySQL por el puerto predeterminado (3306):
$ sudo ufw allow mysql
Regla añadida
Regla añadida (v6)
Detener, iniciar y ver el estado del servicio MySQL
$ service mysql stop
$ service mysql start
$ service mysql status
Ejecutar MySQL (o no) cuando reinie el sistema
$ systemctl enable mysql
$ systemctl disable mysql
Synchronizing state of mysql.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable mysql
Iniciar Shell de MySQL
$ mysql
Iniciar Shell de MySQL como root
Enter password: alejandro_2018
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.22-0ubuntu18.04.1 (Ubuntu)
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
Cambiar password del root desde el Shell
mysql> UPDATE mysql.user SET authentication_string = PASSWORD('2018_alejandro') WHERE user='root';
Query OK, 1 row affected, 1 warning (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 1
mysql> FLUSH PRIVILEGES;
Añadir usuario a MySQL
Crear usuario
mysql> CREATE USER 'alejandro'@'localhost' IDENTIFIED BY '2018_alejandro';
Otorgar permisos al usuario
mysql> GRANT ALL PRIVILEGES ON * . * TO 'alejandro'@'localhost';
- El primer * hace referencia a todas las bases de datos y puede ser sustituido por el nombre de una bd
- El segundo * hace referencia a todas las tablas y puede ser sustituido por el nombre de una tabla.
mysql> FLUSH PRIVILEGES;
Tipos de permisos
- ALL PRIVILEGES: permite a usuario acceder a todas las bases de datos asignadas.
- CREATE: permite crear nuevas tablas o bases de datos.
- DROP: permite eliminar tablas o bases de datos.
- DELETE: permite eliminar registros de tablas.
- INSERT: permite insertar registros en tablas.
- SELECT: permite leer registros en las tablas.
- UPDATE: permite actualizar registros seleccionados en tablas.
- GRANT OPTION: permite remover privilegios de usuarios.
mysql> REVOKE ALL PRIVILEGES ON * . * FROM ‘usuario’@‘localhost’;
Borrar un usuario
mysql> DROP USER ‘usuario’@‘localhost’;
Salir del Shell
mysql> quit
Bye
Iniciar Shell con root y su nueva contraseña
$ mysql -u root -p
Enter password: 2018_alejandro
Ver usuarios de MySQL
mysql> SELECT User, Host, authentication_string FROM mysql.user;
+------------------+-----------+-------------------------------------------+
| User | Host | authentication_string |
+------------------+-----------+-------------------------------------------+
| root | localhost | *15C73F89842C2D8615743263F00BDDC1F952EFA9 |
| mysql.session | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| mysql.sys | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| debian-sys-maint | localhost | *06601677922020569390FE705AC32835D3C4429C |
| alejandro | localhost | *15C73F89842C2D8615743263F00BDDC1F952EFA9 |
+------------------+-----------+-------------------------------------------+
Salir de la sesión del root e iniciar sesión y Shell con 'alejandro'
mysql> quit
bye
$ exit
$ mysql -u alejandro -p
Enter password: 2018_alejandro
Obtener ayuda
Ayuda general
mysql> HELP
Ayuda sobre la sintáxis de un comando
HELP comando
Ejemplos:
mysql> HELP SELECT
mysql> HELP CREATE TABLE
Ayuda sobre los distintos contenidos disponibles
mysql> HELP CONTENTS
Ayuda sobre administración
mysql> HELP ADMINISTRATION
Crear base de datos (vacía)
mysql> CREATE DATABASE personal;
Mostrar bases de datos
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| personal |
| sys |
+--------------------+
Obtener ruta del directorio donde se almacenan las bases de datos
mysql> SHOW VARIABLES WHERE Variable_Name LIKE "datadir";
+---------------+-----------------+
| Variable_name | Value |
+---------------+-----------------+
| datadir | /var/lib/mysql/ |
+---------------+-----------------+
Seleccionar base de datos
mysql> USE personal;
Database changed
Crear tablas en base de datos 'personal'
Crear tablas
mysql> CREATE TABLE Dptos (
id_dpto INT NOT NULL AUTO_INCREMENT,
denom VARCHAR(50) NOT NULL UNIQUE,
PRIMARY KEY (id_dpto)
);
mysql> CREATE TABLE Usuarios (
id_usu INT NOT NULL AUTO_INCREMENT,
cta_usu VARCHAR(15) UNIQUE,
nombre VARCHAR(50) NOT NULL,
id_dpto INT,
ecorreo VARCHAR(50) NOT NULL,
fecha_alta DATETIME NOT NULL,
PRIMARY KEY (id_usu),
FOREIGN KEY (id_dpto) REFERENCES dptos(id_dpto)
);
Tipos de datos
Numéricos
- INT (INTEGER): Ocupación 4 bytes - valores entre -2147483648 y 2147483647 o entre 0 y 4294967295.
- SMALLINT: Ocupación de 2 bytes - valores entre -32768 y 32767 o entre 0 y 65535.
- TINYINT: Ocupación de 1 bytes - valores entre -128 y 127 o entre 0 y 255.
- MEDIUMINT: Ocupación de 3 bytes - valores entre -8388608 y 8388607 o entre 0 y 16777215.
- BIGINT: Ocupación de 8 bytes - valores entre -8388608 y 8388607 o entre 0 y 16777215.
- DECIMAL (NUMERIC): Almacena números de coma flotante como cadenas o string.
- FLOAT (m,d): Almacena números de coma flotante.
- DOUBLE (REAL): Almacena número de coma flotante con precisión doble.
- BIT (BOOL, BOOLEAN): Número entero con valor 0 o 1.
- DATE: Fecha con año, mes y día - rango entre ‘1000-01-01′ y ‘9999-12-31′.
- DATETIME: Fecha (aaaa-mm-dd) y hora (hh-mm-ss) - rango entre ‘1000-01-01 00:00:00′ y ‘9999-12-31 23:59:59′.
- TIME: Hora (hh-mm-ss) - rango entre -838-59-59 y 838-59-59 con el formato ‘HH:MM:SS’.
- TIMESTAMP: Fecha y hora UTC - rango entre ‘1970-01-01 00:00:01′ y ‘2038-01-19 03:14:07′.
- YEAR: Año con 2/4 dígitos, por defecto 4 - rango 4d entre 1901 - 2155 y 2d entre 1970 - 2069.
- CHAR: Ocupación fija. Longitud de 1 a 255 caracteres.
- VARCHAR: Ocupación variable. Longitud de 1 a 255 caracteres.
- TINYBLOB: Longitud máx. 255 caracteres. Para datps binarios como ficheros texto, imágenes, audio, videos.
- BLOB: Longitud máx. 65.535 caracteres. Para datos binarios.
- MEDIUMBLOB: Longitud máx. de 16.777.215 caracteres. Para datos binarios.
- LONGBLOB: Longitud máx. 4.294.967.298 caracteres. Para datos binarios.
- SET: Almacena 0, uno o varios valores de lista con máximo de 64 posibles valores.
- ENUM: Igual que SET pero solo puede almacenar un valor.
- TINYTEXT: Longitud máx. 255 caracteres. Para texto plano sin formato. Distingue entre min. y may.
- TEXT: Longitud máx. 65.535 caracteres. Para texto plano sin formato. Distingue entre min. y may.
- MEDIUMTEXT: Longitud máx. 16.777.215 car. Para texto plano sin formato. Distingue entre min. y may.
- LONGTEXT: Longitud máx. 4.294.967.298 car. Para texto plano sin formato. Distingue entre min. y mayúsculas.
Mostrar tablas
mysql> SHOW TABLES;
+--------------------+
| Tables_in_personal |
+--------------------+
| Dptos |
| Usuarios |
+--------------------+
También,
mysql> SHOW TABLES FROM personal;
Listar campos de una tabla
mysql> DESCRIBE Dptos;
+---------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+----------------+
| id_dpto | int(11) | NO | PRI | NULL | auto_increment |
| denom | varchar(50) | NO | UNI | NULL | |
+---------+-------------+------+-----+---------+----------------+
mysql> DESCRIBE Usuarios;
+------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+----------------+
| id_usu | int(11) | NO | PRI | NULL | auto_increment |
| cta_usu | varchar(15) | YES | UNI | NULL | |
| nombre | varchar(50) | NO | | NULL | |
| id_dpto | int(11) | YES | MUL | NULL | |
| ecorreo | varchar(50) | NO | | NULL | |
| fecha_alta | datetime | NO | | NULL | |
+------------+-------------+------+-----+---------+----------------+
También:
mysql> SHOW FIELDS FROM Usuarios;
y
mysql> SHOW COLUMNS FROM Usuarios;
Insertar registros en una tabla
mysql> INSERT INTO Dptos VALUES (1, "Comercial");
mysql> INSERT INTO Dptos VALUES (2, "Producción");
mysql> INSERT INTO Dptos VALUES (3, "Personal");
mysql> INSERT INTO Dptos VALUES (4, "Formación");
También:
mysql> INSERT INTO Dptos (id_dpto, denom) VALUES (5, "Financiero");
Los campos PRIMARY_KEY no permiten datos duplicados:
mysql> INSERT INTO Dptos VALUES (4, "Ventas");
ERROR 1062 (23000): Duplicate entry '4' for key 'PRIMARY'
mysql> INSERT INTO Usuarios VALUES (1, "asualam", "Alejandro", 2, "as@mysql.es", "2018-04-01");
mysql> INSERT INTO Usuarios (cta_usu, nombre, id_dpto, ecorreo, fecha_alta) VALUES ("asuajim", "Antonio", 2, "sj@mysql.es", "2018-04-02");
mysql> INSERT INTO Usuarios (cta_usu, nombre, id_dpto, ecorreo, fecha_alta) VALUES ("slamost", "María", 4, "ms@mysql.es", "2018-04-12");
mysql> INSERT INTO Usuarios (cta_usu, nombre, id_dpto, ecorreo, fecha_alta) VALUES ("carmor", "Carmen", 1, "cm@mysql.es", "2018-04-01");
mysql> INSERT INTO Usuarios (cta_usu, nombre, id_dpto, ecorreo, fecha_alta) VALUES ("eumor", "Eugenia", 5, "em@mysql.es", "2018-04-10");
mysql> INSERT INTO Usuarios (cta_usu, nombre, id_dpto, ecorreo, fecha_alta) VALUES ("lumor", "Luis", 3, "lm@mysql.es", "2018-04-07");
Un dato de un campo FOREIGN KEY debe existir en la tabla externa:
mysql> INSERT INTO Usuarios (cta_usu, nombre, id_dpto, ecorreo, fecha_alta) VALUES ("aleal", "Alegría", 9, "aa@mysql.es", "2018-04-06");
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (
personal
.Usuarios
, CONSTRAINT Usuarios_ibfk_1
FOREIGN KEY (id_dpto
) REFERENCES Dptos
(id_dpto
))
Consultar datos de una tabla
mysql> SELECT * FROM Dptos;
+---------+-------------+
| id_dpto | denom |
+---------+-------------+
| 1 | Comercial |
| 5 | Financiero |
| 4 | Formación |
| 3 | Personal |
| 2 | Producción |
+---------+-------------+
mysql> SELECT * FROM Dptos WHERE id_dpto = 3;
+---------+----------+
| id_dpto | denom |
+---------+----------+
| 3 | Personal |
+---------+----------+
mysql> SELECT * FROM Dptos WHERE id_dpto <> 3;
+---------+-------------+
| id_dpto | denom |
+---------+-------------+
| 1 | Comercial |
| 5 | Financiero |
| 4 | Formación |
| 2 | Producción |
+---------+-------------+
mysql> SELECT denom FROM Dptos WHERE id_dpto > 1 ORDER BY denom DESC;
+-------------+
| denom |
+-------------+
| Producción |
| Personal |
| Formación |
| Financiero |
+-------------+
mysql> SELECT * FROM Usuarios;
+--------+---------+-----------+---------+-------------+---------------------+
| id_usu | cta_usu | nombre | id_dpto | ecorreo | fecha_alta |
+--------+---------+-----------+---------+-------------+---------------------+
| 1 | asualam | Alejandro | 2 | as@mysql.es | 2018-04-01 00:00:00 |
| 2 | asuajim | Antonio | 2 | sj@mysql.es | 2018-04-02 00:00:00 |
| 3 | slamost | María | 4 | ms@mysql.es | 2018-04-12 00:00:00 |
| 4 | carmor | Carmen | 1 | cm@mysql.es | 2018-04-01 00:00:00 |
| 5 | eumor | Eugenia | 5 | em@mysql.es | 2018-04-10 00:00:00 |
| 6 | lumor | Luis | 3 | lm@mysql.es | 2018-04-07 00:00:00 |
+--------+---------+-----------+---------+-------------+---------------------+
mysql> SELECT nombre, id_dpto FROM Usuarios ORDER BY id_dpto;
+-----------+---------+
| nombre | id_dpto |
+-----------+---------+
| Carmen | 1 |
| Alejandro | 2 |
| Antonio | 2 |
| Luis | 3 |
| María | 4 |
| Eugenia | 5 |
+-----------+---------+
Crear vistas
Una vista es una consulta que se presenta como una tabla (virtual) que se construye a partir de los datos de una o más tablas relacionadas de una base de datos.
Las vistas tienen la misma estructura que una tabla normal (filas y columnas) con la diferencia de que sólo almacenan la definición de una consulta, no los datos.
mysql> CREATE VIEW Nombres_correos AS SELECT nombre, ecorreo FROM Usuarios;
mysql> CREATE VIEW Usuarios_dptos AS SELECT Usuarios.nombre, Dptos.denom AS departamento FROM Usuarios INNER JOIN Dptos ON Dptos.id_dpto = Usuarios.id_dpto;
Consultar datos de una vista
mysql> SELECT * FROM Nombres_correos;
+-----------+-------------+
| nombre | ecorreo |
+-----------+-------------+
| Alejandro | as@mysql.es |
| Antonio | sj@mysql.es |
| María | ms@mysql.es |
| Carmen | cm@mysql.es |
| Eugenia | em@mysql.es |
| Luis | lm@mysql.es |
+-----------+-------------+
mysql> SELECT * FROM Usuarios_dptos;
+-----------+--------------+
| nombre | departamento |
+-----------+--------------+
| Carmen | Comercial |
| Eugenia | Financiero |
| María | Formación |
| Luis | Personal |
| Alejandro | Producción |
| Antonio | Producción |
+-----------+--------------+
mysql> SELECT * FROM Usuarios_dptos WHERE departamento = "Personal";
+--------+--------------+
| nombre | departamento |
+--------+--------------+
| Luis | Personal |
+--------+--------------+
Consultar tablas y vistas
mysql> SHOW TABLES;
+--------------------+
| Tables_in_personal |
+--------------------+
| Dptos |
| Nombres_correos |
| Usuarios |
| Usuarios_dptos |
+--------------------+
Borrar una vista
mysql> DROP VIEW IF EXISTS Nombres_correos;
Actualizar datos de una tabla
mysql> UPDATE Usuarios SET nombre = "José Luis", ecorreo = "jl@mysql.es" WHERE id_usu = 6;
mysql> UPDATE Usuarios SET ecorreo = "produc@mysql.es" WHERE id_dpto = 2;
Rows matched: 2 Changed: 2 Warnings: 0
mysql> SELECT * FROM Usuarios;
+--------+---------+------------+---------+-----------------+---------------------+
| id_usu | cta_usu | nombre | id_dpto | ecorreo | fecha_alta |
+--------+---------+------------+---------+-----------------+---------------------+
| 1 | asualam | Alejandro | 2 | produc@mysql.es | 2018-04-01 00:00:00 |
| 2 | asuajim | Antonio | 2 | produc@mysql.es | 2018-04-02 00:00:00 |
| 3 | slamost | María | 4 | ms@mysql.es | 2018-04-12 00:00:00 |
| 4 | carmor | Carmen | 1 | cm@mysql.es | 2018-04-01 00:00:00 |
| 5 | eumor | Eugenia | 5 | em@mysql.es | 2018-04-10 00:00:00 |
| 6 | lumor | José Luis | 3 | jl@mysql.es | 2018-04-07 00:00:00 |
+--------+---------+------------+---------+-----------------+---------------------+
Borrar registros de una tabla
El gestor preserva la integridad referencial de la base de datos evitando que se borren registros con claves primarias vinculadas con campos de otras tablas, hasta que estos últimos sean suprimidos:
mysql> DELETE FROM Dptos WHERE id_dpto = 5;
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (
personal
.Usuarios
, CONSTRAINT Usuarios_ibfk_1
FOREIGN KEY (id_dpto
) REFERENCES Dptos
(id_dpto
))Para que sea posible el borrado anterior:
mysql> DELETE FROM Usuarios WHERE id_dpto = 5;
mysql> DELETE FROM Dptos WHERE id_dpto = 5;
Añadir campos a una tabla
Añadir campo al final de la tabla
mysql> ALTER TABLE Dptos ADD telef VARCHAR(15) NOT NULL DEFAULT "900 100 999";
mysql> SELECT * FROM Dptos;
+---------+-------------+-------------+
| id_dpto | denom | telef |
+---------+-------------+-------------+
| 1 | Comercial | 900 100 999 |
| 2 | Producción | 900 100 999 |
| 3 | Personal | 900 100 999 |
| 4 | Formación | 900 100 999 |
+---------+-------------+-------------+
Añadir un campo después de otro
mysql> ALTER TABLE Dptos ADD web VARCHAR(50) AFTER denom;
mysql> SELECT * FROM Dptos;
+---------+-------------+------+-------------+
| id_dpto | denom | web | telef |
+---------+-------------+------+-------------+
| 1 | Comercial | NULL | 900 100 999 |
| 2 | Producción | NULL | 900 100 999 |
| 3 | Personal | NULL | 900 100 999 |
| 4 | Formación | NULL | 900 100 999 |
+---------+-------------+------+-------------+
Para añadir un campo al principio de la tabla utilizar la claúsula FIRST
Borrar campos de una tabla
mysql> ALTER TABLE Dptos DROP web;
Cambiar el tipo de un campo
mysql> ALTER TABLE Dptos MODIFY telef CHAR(11);
mysql> DESCRIBE Dptos;
+---------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+----------------+
| id_dpto | int(11) | NO | PRI | NULL | auto_increment |
| denom | varchar(50) | NO | UNI | NULL | |
| telef | char(11) | YES | | NULL | |
+---------+-------------+------+-----+---------+----------------+
Renombrar un campo y cambiar su tipo
mysql> ALTER TABLE Dptos CHANGE telef telefono VARCHAR(11);
mysql> DESCRIBE Dptos;
+----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+----------------+
| id_dpto | int(11) | NO | PRI | NULL | auto_increment |
| denom | varchar(50) | NO | UNI | NULL | |
| telefono | varchar(11) | YES | | NULL | |
+----------+-------------+------+-----+---------+----------------+
Borrar una tabla
Crear nueva tabla para borrar después
mysql> CREATE TABLE Sede (
id_sede INT NOT NULL AUTO_INCREMENT,
provincia VARCHAR(20) NOT NULL,
PRIMARY KEY (id_sede)
);
Mostrar todas las tablas de la base de datos
mysql> SHOW TABLES;
+--------------------+
| Tables_in_personal |
+--------------------+
| Dptos |
| Sede |
| Usuarios |
| Usuarios_dptos |
+--------------------+
Borrar la tabla 'Sede'
mysql> DROP TABLE IF EXISTS Sede;
Índices
Un índice permite consultar datos con más rapidez, acelerar la operación de ordenación y hacer cumplir las restricciones únicas.
Cada índice debe estar asociado con una tabla específica. Un índice se compone de una o más columnas pero todas las columnas de un índice deben estar en la misma tabla. Una tabla puede tener varios índices.
Crear un índice
mysql> CREATE INDEX Usuarios_nombre ON Usuarios(nombre);
Conocér campos claves que pueden se usados en un índice (Key)
mysql> DESCRIBE Usuarios;
+------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+----------------+
| id_usu | int(11) | NO | PRI | NULL | auto_increment |
| cta_usu | varchar(15) | YES | UNI | NULL | |
| nombre | varchar(50) | NO | MUL | NULL | |
| id_dpto | int(11) | YES | MUL | NULL | |
| ecorreo | varchar(50) | NO | | NULL | |
| fecha_alta | datetime | NO | | NULL | |
+------------+-------------+------+-----+---------+----------------+
Comprobar si en una consulta se utiliza un índice
mysql> EXPLAIN SELECT nombre FROM Usuarios;
+----+-------------+----------+--------+-----------------+---------+-------------+
| id | select_type | table | type | key | key_len | Extra |
+----+-------------+----------+--------+-----------------+---------+-------------+
| 1 | SIMPLE | Usuarios | index | Usuarios_nombre | 52 | Using index |
+----+-------------+----------+--------+-----------------+---------+-------------+
Mostrar los índices de una tabla
mysql> SHOW INDEX FROM Usuarios;
Borrar un índice
mysql> ALTER TABLE Usuarios DROP INDEX Usuarios_nombre;
Crear un índice multicampo
mysql> CREATE INDEX Fecha_nombre ON Usuarios (fecha_alta, nombre);
Crear un índice UNIQUE (sin duplicados)
mysql> CREATE UNIQUE INDEX Cta_usuario ON Usuarios (cta_usu);
Exportar base de datos
$ mysqldump -u alejandro -p personal > personal.sql
Relacionado: Bases de datos MySQL (y MariaDB) con PyMySQL