Buscar

Rss Artículos

Foro

Autor

 

Artículos en ‘Base de datos’

Generar secuencias para Oracle

May 07

Qué es una secuencia

Las secuencias en Oracle simulan el “autoincremento” de un campo en la base de datos, algo parecido a lo que podemos encontrar por ejemplo en mySQL, y aunque en algunos casos bastará con asignar a un campo el tipo “autoincremento” en Oracle necesitaremos generar una secuencia, para ello tomaremos como ejemplo esta plantilla:

CREATE SEQUENCE nombre_secuencia
INCREMENT BY numero_incremento
START WITH numero_por_el_que_empezara
MAXVALUE valor_maximo | NOMAXVALUE
MINVALUE valor_minimo | NOMINVALUE
CYCLE | NOCYCLE
ORDER | NOORDER

Los valores que tendremos que añadir son bastante sencillos, el parámetro CYCLE, indicará que cuando la secuencia llegue a su valor máximo, esta vuelva a empezar, si por el contrario, usamos NOCYCLE esto no ocurrirá.

El parámetro ORDER y NOORDER es quizá el menos utilizado, con ORDER implicará que las secuencias son generadas en el orden de petición y esto sólo será necesario para bases de datos de aplicaciones en tiempo real que sean usadas desde distintas ubicaciones, en aplicaciones “normales” bastará con poner NOORDER

Un ejemplo de una secuencia válida sería

CREATE SEQUENCE SECUENCIA1
INCREMENT BY 1
START WITH 1
MAXVALUE 9999999999
MINVALUE 1
NOCYCLE
NOORDER
;

Crear secuencias con el Erwin

Podemos usar un programa como el Erwin (Herramienta Case para el modelo de bases de datos) para generarlas, daremos botón derecho, nueva secuencia y rellenaremos los datos necesarios.

Después, tools forward engineer / schema generation nos aparecerá una ventana donde seleccionaremos el código de que queremos generar, después pulsaremos preview y obtendremos nuestra secuencia.

Después en el Toad, SQL Plus, o cualquiera que sea el programa que usemos para administrar nuestra base de datos, bastará con ejecutarla y ya estará generada.

Para utilizar la secuencia, tendremos que ejecutar la sentencia

SELECT nombre_secuencia.nextval FROM DUAL

Con ello recibiremos el siguiente valor de la secuencia.

Una cosa a tener en cuenta es que siempre que llamemos a la secuencia se aumentará su valor en lo establecido, independientemente de si luego hacemos algo con ese valor o no.

Compilar mySQL en tu MAC

Nov 14

¿Quieres compilar mySQL en tu MAC? pues sigue las instrucciones de este how-to

SQL: seleccionar un registro aleatorio

Ago 15

Nunca había necesitado hacer algo así pero hoy, por razones del destino necesitaba seleccionar de la base de datos un registro de manera totalmente aleatoria, si alguna vez necesitas hacer lo mismo, puedes hacer uso la siguiente sintaxis:

SELECT * FROM Tabla ORDER BY RAND() LIMIT 1

Lo de limit 1 implica que sólo nos devuelva un registro, pero no es obligatorio, lo que realmente implica el orden aleatorio es la clausula ORDER BY RAND()

Si también queremos que los registros aleatorios no sean repetidos, bien podemos quitar el limit 1 y saldrán todos de manera aleatoria (sin ningún orden aparente) o bien podemos ir poniendo los que han salido en otra tabla y usar el comando NOT IN

SELECT * FROM Tabla1 ORDER BY RAND() LIMIT 1 WHERE Campo1 NOT IN (SELECT campo2 FROM Tabla2)

En vez de una segunda tabla también podemos usar un array.

Sentencias SQL desconocidas

Jun 24

Recuerdo que en segundo de carrera tuve todo un mes de sentencias SQL y el examen fueron 40 sentencias a crear y reconozco que después de leer este artículo hay bastante que desconocía.

Sin duda el poder usar algunas de estas sentencias nos ayudará y simplifacará nuestra tarea.

Fuente: Sentencias de SQL que desconocías

Analisis de seguridad PHP + MySQL

May 28

Interesante proyeto de fin de carrera que trata sobre el análisis de seguridad de un portal que funciona bajo PHP y MySQL.

MySQL vs PostgreSQL

Mar 15

Acabo de terminar mi exposición sobre el trabajo de investigación de Bases de datos, “Comparativa de bases de datos en internet, MySQL vs PostregSQL“.

La verdad es que se ha dado bastante bien, y me ha gustado mucho, ya que he aprendido nuevas cosas sobre estas bases de datos.

Hasta ahora solo usaba MySQL y tablas del tipo MyISAM, que no permiten transacciones, subconsultas y tampoco ofrecen integridad en los datos.

La verdad es que estas características para todas las páginas que he desarollado nunca me han hecho falta, pero no está de mas saber que InnoDB si ofrece todas ellas, pero a costa de un alto rendimiento (no recomendado).

Como conclusiones puedo decir que para bases de datos pequeñas y que no requieran integridad ni restricciones (constrains), MySQL ofrece mayor velocidad, pero para cualquier otra base de datos yo usaría PostgreSQL ya que con 20.000 registros (los que he probado en mi benchmark) ofrece mejores rendimientos (incluso mejor velocidad) en consultas compuestas.

Todas las pruebas las hice con PHP 5.0 y con las versiones de las bases de datos:

MySQL 5.0.13-rc-nt

PostgreSQL 8.0.1

l

Esta es la función que genera los datos aleatorios a insertar en las tablas

function generar_dato ($lon)
{
$patron = “1234567890abcdefghijklmnopqrstuvwxyz”;
for($i=0;$i<$lon;$i++)
{
if(isset($dato))
$dato .= $patron{rand(0,35)};
else
$dato = $patron{rand(0,35)};
}
return $dato;
}

Y esta es la función con la que calculamos el tiempo que tarda cada operación en ejecutarse, es llamada antes y después de las operaciones, y restandolas obtenemos los microsegundos.

function calcular_time()
{
list($useg, $seg) = explode(” “, microtime());
return ((float)$useg + (float)$seg);
}

Si quereis probarlo en casa, cuidado con tener firewall o antivirus, ya que en mi caso, al tener que filtrar todo me producía un retardo “apreciable”, y otra cosilla, es que por defecto el PostreSQL viene con la opción fsync a on.
Mediante esta opción, PostgreSQL realiza un COMMIT después de cada operación (transaccional), lo que conlleva un retardo de tiempo cuantioso, si queremos compararlo con MyISAM deberemos poner esta opción a off (ambas como no transaccionales).

Ya había leído antes sobre que PostreSQL era mejor que MySQL, pero bueno, en mi caso hago esa pequeña matización, y apoyo esa afirmación, PostreSQL ofrece una base mucho mas potente y eficaz que MySQL.