Skip to main content

Crear y establecer un campo autoincremental manualmente en MySQL

Más que un artículo es una autonota, con una situación en la que me he encontrado hoy mismo.

A veces pasa que por error o necesidades del proyecto, te encuentras con una tabla que no tiene un clave primaria. Al querer añadir un nuevo campo id resulta que todos se establecen a 0, y no puedes usar el AUTO_INCREMENT de MySQL ni siquiera establecerlo como PRIMARY_KEY. Para solucionarlo hay que poner manualmente un valor distinto para cada registro.

Para hacerlo rápidamente, podemos recurrir a esta query:

SET @position := 0; -- Define una variable
UPDATE mi_tabla
SET id = (@position := @position + 1)
WHERE id = 0;

Esto cambiará todos los campos ID por un valor que se genera usando la variable @position, y así establecemos un id diferente, que nos permitirá cambiar el campo como PRIMARY_KEY y AUTO_INCREMENT.

Comando grep

Este será un artículo práctico, en el que pondré algunos ejemplos de cómo encontrar archivos que contienen una cadena de texto determinada.

A mi me pasa en muchas ocasiones, intentar encontrar en qué lugar de una aplicación (su código fuente) hay una cadena de texto concreta – ya sea la definición de una constante o una palabra clave que en algún momento puse – resulta en ocasiones más que entretenido.

Es cierto que si utilizas frameworks como Eclipse o similares, estas opciones suelen venir integradas de manera más o menos sencillas, pero trabajando desde un terminal, la cosa cambia.

El comando que nos permitirá realizar una búsqueda de una cadena de texto dentro de uno o más ficheros o incluso toda una estructura de directorios, es grep.

A continuación aquí van algunos ejemplos básicos y muy habituales:

pedro@pedro-laptop:/home/pedro$ cat catalina.out | grep UPDATE

o también

pedro@pedro-laptop:/home/pedro$ grep UPDATE catalina.out

Estos dos comandos hacen lo mismo, muestra por pantalla todas las líneas que contengan la palabra UPDATE dentro del fichero catalina.out.

pedro@pedro-laptop:/home/pedro$ tail -f /var/log/syslog | grep usb
pedro@pedro-laptop:/home/pedro$ tail -f /var/log/apache2/access.log |grep web_concreta.html

Así podremos ver en tiempo real qué dispositivos usb se conectan y desconectan al PC o cuando se está accediendo a una web_concreta.html en Apache, respectivamente.

Si lo que necesitamos es buscar de manera recursiva en la estructura de directorios, basta con usar la opción -r:

pedro@pedro-laptop:/home/pedro$ grep -r UPDATE /path/to/dir

También podemos mostrar el archivo que contiene la cadena que estamos buscando, en vez de mostrar sólo el contenido del fichero:

pedro@pedro-laptop:/home/pedro$ grep -H -r usb /var/log/

El anterior comando muestra los archivos y la linea que contiene usb dentro de /var/log y todos sus subdirectorios.

Si lo que necesitamos es mostrar únicamente el fichero sin mostrar el contenido, también es posible:

pedro@pedro-laptop:/home/pedro$ grep -lr usb /var/log/

Si sabemos el nombre o la extensión del archivo que estamos buscando podemos acotar más la búsqueda, ejecutando el siguiente comando:

pedro@pedro-laptop:/home/pedro$ grep -Hr hidden /ruta/a/directorio |grep nombre_de_archivo

Esto nos mostrará todos los ficheros llamados nombre_de_archivo que se encuentran dentro de /ruta/a/directorio y que contienen hidden.

Si lo que necesitas es encontrar la cadena de texto -r, puedes usar las comillas dobles:

pedro@pedro-laptop:/home/pedro$ grep -H -r “-r” /var/log/

Cabe recordar que si el resultado del comando es un listado demasiado largo, tenemos la opción de añadir al final de cualquiera de los anteriores comandos | more que nos permitirá paginar los resultados encontrados, o bien añadir también al final > resultados.txt para generar un fichero de texto con los resultados obtenidos. Añadiendo >> resultados.txt, añadiremos los resultados al final del fichero.

Un saludo!