Páginas

Mostrando entradas con la etiqueta MySQL. Mostrar todas las entradas
Mostrando entradas con la etiqueta MySQL. Mostrar todas las entradas

martes, 11 de mayo de 2021

Crear disparadores (Triggers) en Google Cloud

Tras recibir el error:

ERROR 1419 (HY000): You do not have the SUPER privilege and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)


Leí que SUPER no está habilitado en las instancias de Google Cloud. Lo que permiten es configurar Marcas de bases de datos.

Seguir el procedimiento indicado:
  • Abrir la Consola
  • Ir a la instancia SQL
  • Editarla (En mi caso pidió activar la API de la consola previamente)
  • En la sección Marcas agregar el elemento deseado de la lista desplegable. log_bin_trust_function_creators
  • Guardar


Esperar a que el proceso termine y luego ya se puede crear disparadores. Después se puede eliminar la marca.

sábado, 27 de junio de 2020

MySQL. agrupar por fecha y contar incluido los ceros cuando no hay datos para una fecha



La idea la encontré en stack overflow "MySQL group by date and count including missing dates".
Consiste en generar tantos números como días se quiera. En el ejemplo se generan 10 mil filas. Y como se toma como referencia la fecha actual, son 10 mil días hacia atrás. Eso son más de 27 años.

create view datetable as
select
date_format(adddate(now(),-(a.a + (10 * b.a) + (100 * c.a) + (1000 * d.a))),'%Y-%m-%d') AS date
from (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4
union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as a
cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4
union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as b
cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4
union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as c
cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4
union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as d
; 
Entonces, la idea es realizar un LEFT JOIN con esta vista para así obtener todas las filas incluidas las no relacionadas, y condicionar para el rango de fechas deseado. Por ejemplo, a continuación con una tabla de usuarios.
select 
    datetable.date,
    count(users.id) users
from
    datetable
    left join users on datetable.date = date_format(users.createdAt,'%Y-%m-%d')
where
    datetable.date 
        between date_format('2020-06-20','%Y-%m-%d') 
        and date_format('2020-06-30','%Y-%m-%d')
group by
    datetable.date;
+------------+-------+
| date       | users |
+------------+-------+
| 2020-06-20 |     0 |
| 2020-06-21 |     0 |
| 2020-06-22 |     0 |
| 2020-06-23 |     0 |
| 2020-06-24 |     0 |
| 2020-06-25 |     0 |
| 2020-06-26 |   207 |
| 2020-06-27 |     0 |
+------------+-------+
Todos los usuarios fuerondatos de alta el 2020-06-26 por eso se ve que ese día tiene los 207 usuarios y el resto de días cero. Aunque en el rango se indica entre el 20 y 30 de junio. La sentencia se ejecuta el 27 de junio que es la fecha actual que toma de referencia en la vista. Por ello, no se ve datos para el 28, 29, 30.
Entendiendo la idea se puede adaptar al problema a resolver.




miércoles, 6 de marzo de 2019

MySQL en SQL Developer




En este caso interesa el JDBC Driver for MySQL

Escoge el sistema operativo en el que se utilizará. Para instalar en MAC: Platform Independent

Descarga el archivo ZIP en el que se encuentra el .jar

  • Segundo, añade el archivo en SQL developer->Preferencias
Bases de datos->Controladores JDBC de Terceros
Y agrega el archivo .jar




Al intentar utilizar MySQL con SQL developer puede dar un error:

«Status : Failure - The server time zone value 'AEST' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specific time zone value if you want to utilize time zone support»

Añade al archivo de configuración my.ini en la instalación de MySQL después de [mysqld] la línea.

default-time-zone='+01:00'

Guarda y reinicia el servicio.

El archivo my.ini utilizado fue el de: C:\ProgramData\MySQL\MySQL Server 5.7\my.ini al tener la instalación en un Windows.

Otras rutas en las que se puede encontrar o crear el archivo de configuración:
C:\Windows\my.ini C:\Windows\my.cnf C:\my.ini C:\my.cnf C:\Program Files\MySQL\MySQL Server 5.7\my.ini C:\Program Files\MySQL\MySQL Server 5.7\my.cnf

viernes, 15 de febrero de 2019

MySQL: crear índice único y no único

Una PRIMARY KEY crea un índice único asociado al campo que es clave primaria, además es NOT NULL por defecto, y por tabla se tiene una sola clave primaria.
Cuando queremos que un campo o varios sean únicos entonces creamos una constraint UNIQUE y si queremos que sea un índice no único lo declaramos como KEY pero no en la misma línea del campo porque significaría que declaramos una PRIMARY KEY, y no es lo que queremos.

create table test(
    clave_primaria    int unsigned not null,
    clave_unica       varchar(128) default null,
    clave_nounica     varchar(128) default null,
    constraint pk_test_claveprimaria primary key(clave_primaria),
    constraint uq_test_claveunica unique(clave_unica),
    key(clave_nounica)
);





Se ha utilizado
-MySQL Ver 14.14 Distrib 5.7.23, for Win64

miércoles, 1 de agosto de 2018

MySQL: Generar un número aleatorio



Para generar un número aleatorio entre un rango [mínimo, máximo], es decir inclusivo: n >= mínimo, n <= máximo.
FLOOR(RAND() * (máximo - mínimo + 1)) + mínimo;

Probado en MySQL 5.7

lunes, 16 de julio de 2018

sábado, 11 de febrero de 2017

Tamaño de base de datos en MySQL



Con la siguiente consulta se puede obtener lo que ocupa una base de datos en MySQL


SELECT
table_schema as BasedeDatos,
sum( data_length + index_length ) / 1024 / 1024 as TamañoEnMB,
sum( data_free )/ 1024 / 1024 as EspacioLibreEnMB
FROM information_schema.TABLES
GROUP BY table_schema ;



Fuente: https://forums.mysql.com/read.php?108,201578,201578