Está en la página 1de 3

Registros aleatorios en SQL con newid()

16-Enero-2010 no comentado Aunque SQL dispone de la funcin RAND() para generar nmeros aleatorios su uso es limitado. Por ejemplo, si lo ejecutamos varias veces en una misma transaccin, siempre nos devolver el mismo valor. Con lo que, si queremos devolver un valor aleatorio en cada fila de una consulta, no podemos usarlo. Una opcin ms potente que el RAND() para generar valores aleatorios es la utilizacin de la funcin NEWID() de SQL. NEWID() nos devuelve una cadena larga basada en la MAC de la tarjeta de red y el reloj del sistema. Este s ser un valor aleatorio ms til, ya que obtendremos un valor distinto en cada llamada a NEWID() aunque sea en la misma transaccin. Pongamos como ejemplo que queremos devolver un registro aleatorio de una tabla, lo podramos hacer con esta sentencia: view source print?
1 SELECT TOP 1 * 2 FROM tabla 3 ORDER BY NEWID()

Con esto obtendramos el primer registro pero de un listado con orden aleatorio. Lgicamente, si quitamos el TOP 1 de la sentencia, obtendramos el listado aleatorio completo. Y si volvemos a ejecutar la sentencia, el mismo listado pero con un orden diferente al obtenido en la anterior ejecucin. Si por algn motivo necesitamos generar en SQL un nmero aleatorio. Podemos transformar el resultado de la funcin NEWID() en un entero con la funcin CHECKSUM de la siguiente manera: view source print?
1 select checksum(newid())

Esta sentencia puede devolver en algn caso nmeros negativos, esto lo solucionamos utilizando la funcin abs que nos devuelve el valor absoluto: view source print?
1 select abs(checksum(newid()))

Y si queremos limitar el valor de este nmero aleatorio, utilizamos el resto de la divisin entera (%) como en otros lenguajes de programacin: view source print?
1 select abs(checksum(newid())) % 10

Con esta ltima sentencia obtenemos un valor aleatorio entre 0 y 9 en SQL.

MySQL CHECKSUM
Original post: http://anothermysqldba.blogspot.com/2013/05/mysql-checksum.html

CHECKSUM TABLA informacin es til cuando se est comprobando el estado de una tabla.Esto se utiliza a menudo antes y despus de una copia de seguridad y restauracin para asegurar que los datos estn intactos. Aqu est una manera fcil de usar a travs de la lnea de comandos de MySQL y las herramientas ya disponibles para usted.

mysql> CREATE USER 'checksumuser'@'localhost'; mysql>GRANT SELECT ON *.* TO 'checksumuser'@'localhost';

mysql>SELECT CONCAT('mysql --user=checksumuser -e \'CHECKSUM TABLE ',TABLE_SCHEMA,'.',TABLE_NAME ,' EXTENDED\'; ') as cmd_line_query INTO OUTFILE '/tmp/checksums.sh' FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA NOT IN ('mysql', 'INFORMATION_SCHEMA') AND ENGINE IS NOT NULL GROUP BY TABLE_SCHEMA, TABLE_NAME; mysql> exit

# chmod +x /tmp/checksums.sh # /tmp/checksums.sh > /tmp/checksums_b4dump.sql

Ahora vas a tener todos sus datos de suma de comprobacin disponibles para usted en el archivo de la lista. Ejemplo simple de los datos por debajo de

Table Checksum world.City 2011482258 Table Checksum world.Country 580721939 Table Checksum world.CountryLanguage 1546017027

Despus de la descarga o el proceso se est ejecutando, a continuacin, se puede ejecutar el mismo guin solo cambia el archivo de salida y luego cargarlo y compara resultados. No es el mtodo ms limpio, pero es un control fcil y rpida para que usted haga.
# /tmp/checksums.sh > /tmp/checksums_after_dump.sql

mysql> use test mysql> CREATE TABLE `checksums` ( `checksums_id` int(11) NOT NULL AUTO_INCREMENT, table_name varchar(100) DEFAULT NULL, size_a int(11) DEFAULT NULL, size_b int(11) DEFAULT NULL, PRIMARY KEY (`checksums_id`) ) ENGINE=InnoDB ; LOAD DATA INFILE '/tmp/checksums_b4dump.sql' IGNORE INTO TABLE checksums (table_name, size_a); LOAD DATA INFILE '/tmp/checksums_after_dump.sql' IGNORE INTO TABLE checksums (table_name, size_b); DELETE FROM checksums WHERE table_name = 'Table'; SELECT a.table_name , a.size_a, b.size_b FROM checksums a INNER JOIN checksums b ON a.table_name = b.table_name and a.checksums_id != b.checksums_id WHERE a.size_a IS NOT NULL AND b.size_b IS NOT NULL ; +-----------------------------------------------------------------------+-----------+------------+ | table_name | size_a | size_b | +-----------------------------------------------------------------------+-----------+------------+ | world.City | 2011482258 | 2011482258 | | world.Country | 580721939 | 580721939 | | world.CountryLanguage | 1546017027 | 1546017027 | +-----------------------------------------------------------------------+-----------+------------+

#mysql -p mysql> DROP USER 'checksumuser'@'localhost';

También podría gustarte