Duplicar o clonar tablas en mysql

MySQL nos proporciona dos maneras de "clonar" una tabla, tanto su estructura como su estructura y sus datos, podemos querer duplicar una tabla para hacer algún tipo de backup rápido, mantener un histórico, o migrar la tabla a un esquema o base de datos diferentes, entre otras cosas.

Clonar una tabla usando SELECT

La sentencia de creación CREATE TABLE (..) SELECT nos permite crear la tabla con los registros que devuelva la consulta de selección, pero tiene las siguientes limitaciones:

  • No traspasa las constraints de tipo PRIMARY KEY
  • No traspasa las definiciones de AUTO_INCREMENT
  • No traspasa las definiciones de DEFAULT CURRENT_TIMESTAMP
  • Utiliza el storage engine por defecto y no el de la tabla (en caso de que sean distintos)
  • Solamente traspasa los registros afectados por la SELECT, que podría no devolver ninguno y crear la tabla vacía

Parking con tolerancia "Cero"

Este amistoso cartel me lo encontré de paso por la zona de la Bonanova en Barcelona, me gustaría haber visto la cara del ferretero al que le llevaron a grabar el letrero en cuestión...

Sin duda es una buena mezcla de agresividad pasiva y consecuencias fatales....

Módulo de Views para Drupal

Nota: Este post es parte de una serie de posts dedicados a CCK y al uso avanzado de las vistas con argumentos en Drupal.

Cómo poner la primera letra de una frase en mayúsculas con MySQL

Normalmente los sistemas de programación y bases de datos nos proveen con una función relativamente simple cuya utilidad consiste en transformar la primera letra de una frase o palabra a mayúsculas, en php es ucfirst(), en Oracle es initcap (en el caso de transformar una frase, la función de Oracle pone cada primera palabra en mayúsculas), pero parece ser que MySQL no la tiene, por lo que tenemos que explorar un poco más y usar una solución más creativa. Pongamos como ejemplo esta frase:

mysql> SET @frase = 'bienvenidos a cambrico.net'; 
Query OK, 0 rows affected (0.00 sec) 
mysql> SELECT @frase; 
+----------------------------+ | 
@frase | 
+----------------------------+ | 
bienvenidos a cambrico.net | 
+----------------------------+ 
1 row in set (0.00 sec)

Nota: He utilizado una variable de mysql con SET y @ para hacer las siguientes operaciones un poco mas simples. Tenemos funciones como UPPER/UCASE y LOWER/LCASE para transformar a mayúsculas o minúsculas la cadena:

mysql> SELECT UPPER(@frase); 
+----------------------------+ | 
UPPER(@frase) | 
+----------------------------+ | 
BIENVENIDOS A CAMBRICO.NET | 
+----------------------------+ 
1 row in set (0.00 sec)

Y para obtener la primera letra de la cadena en mayúsculas podemos utilizar un encadenado de las siguientes funciones: LEFT, para tomar el primer caracter de la izquierda y SUBSTR para coger los restantes, de esta forma tenemos aislada la primera letra. Aplicamos UPPER para transformarla en mayúsculas y unimos la cadena de nuevo con CONCAT (si tenemos sql_mode en ANSI_QUOTES, podemos usar ||)

mysql> SELECT CONCAT(UPPER(LEFT(@frase,1)),SUBSTR(@frase,2));
+------------------------------------------------+ | 
CONCAT(UPPER(LEFT(@frase,1)),SUBSTR(@frase,2)) | 
+------------------------------------------------+ | 
Bienvenidos a cambrico.net | 
+------------------------------------------------+ 
1 row in set (0.00 sec)

Actualizo: Para hacer lo que comenta Roberto, es decir, poner todas las palabras con la primera letra en mayúscula, tienes que hacer un procedimiento o una función (esto solo es posible a partir de MySQL 5.0). Os dejo un ejemplo:

DELIMITER // 
DROP FUNCTION IF EXISTS initcap; // 
CREATE FUNCTION initcap(cadena VARCHAR(100)) RETURNS VARCHAR(100) 
BEGIN 
DECLARE pos INT DEFAULT 0; 
DECLARE tmp VARCHAR(100) DEFAULT ''; 
DECLARE result VARCHAR(100) DEFAULT ''; 
REPEAT SET pos = LOCATE(' ', cadena); 
 IF pos = 0 THEN SET pos = CHAR_LENGTH(cadena); 
 END IF; 
 SET tmp = LEFT(cadena,pos); 
 SET result = CONCAT(result, UPPER(LEFT(tmp,1)),SUBSTR(tmp,2)); 
 SET cadena = RIGHT(cadena,CHAR_LENGTH(cadena)-pos); 
UNTIL CHAR_LENGTH(cadena) = 0 END REPEAT; 
RETURN result; 
END; //

Y a partir de ahora, en la base de datos que hayamos creado la función, podremos utilizarla:

mysql> SELECT initcap(@frase); 
+----------------------------+ | 
initcap(@frase) | 
+----------------------------+ | 
Bienvenidos A Cambrico.net | 
+----------------------------+ 
1 row in set (0.00 sec)

Con una pequeña modificación de la función anterior, podemos filtrar las palabras de menos de 4 caracteres (por ejemplo), para no poner en mayúsculas la mayoría de conectores:

DELIMITER // 
DROP FUNCTION IF EXISTS initcap; // 
CREATE FUNCTION initcap(cadena VARCHAR(100)) RETURNS VARCHAR(100) 
BEGIN 
DECLARE pos INT DEFAULT 0; 
DECLARE tmp VARCHAR(100) 
DEFAULT ''; 
DECLARE result VARCHAR(100) DEFAULT ''; 
REPEAT SET pos = LOCATE(' ', cadena); 
 IF pos = 0 THEN SET pos = CHAR_LENGTH(cadena); 
 END IF; 
 SET tmp = LEFT(cadena,pos); 
 IF CHAR_LENGTH(tmp) < 4 THEN SET result = CONCAT(result, tmp); 
 ELSE SET result = CONCAT(result, UPPER(LEFT(tmp,1)),SUBSTR(tmp,2)); 
 END IF; 
 SET cadena = RIGHT(cadena,CHAR_LENGTH(cadena)-pos); 
UNTIL CHAR_LENGTH(cadena) = 0 END REPEAT; 
RETURN result; 
END; //

Y el resultado sería ligeramente distinto:

mysql> SELECT initcap(@frase); 
+----------------------------+ | 
initcap(@frase) | 
+----------------------------+ | 
Bienvenidos a Cambrico.net | 
+----------------------------+ 
1 row in set (0.00 sec) 

Curso Introducción a Drupal 5.x

Oskar Calvo me ha pasado esta información sobre un curso que van a impartir a través de su empresa. Se trata de una formación online orientada a la toma de contacto con Drupal donde se podrá obtener una idea general del funcionamiento del CMS y bastantes nociones para administrarlo a nivel de webmaster.

Artículos destacados del mes de Junio

Os dejo algunos de los artículos que he leído el mes pasado y me han parecido muy interesantes.
Aquí podéis ver los del mes de Mayo

Módulo de CCK (Content Construction Kit) para Drupal

Nota: Quiero hacer una serie de posts dedicados a las vistas con argumentos en Drupal, pero para hacer esto, me parece mejor explicar antes el modulo de Views, y para darle contexto, el de CCK.

10 consejos para superar los exámenes de certificación de Mysql.

Tras superar el examen Certified MySQL Developer - I, he pensado que sería útil para aquellos que se estén planteándo empezar a estudiar para obtener la certificación publicar algunos consejos o ideas que he usado.
Esta lista está orientada a Mysql 5.0, pero hay muchos puntos que podrían ser genéricos para otros exámenes / sistemas / versiones.

  1. El primer paso a tomar para empezar el camino de la certificación es adquirir la guía oficial de estudio: MySQL 5.0 Certification Study Guide, cuesta entre 20 y 35 euros (según pilléis la oferta de Amazon), y es realmente útil por cuatro motivos:
    • Os permitirá acostumbraros a la terminología en inglés, ya que los exámenes están en este idioma.
    • Cubre los cuatro exámenes principales, los dos de desarrollador y los dos de DBA, por lo que con un solo libro lo abarcáis todo.
    • Trae un CD con muchísimas preguntas (con sus respuestas), separadas por tema y exámen.
    • Viene con un 25% de descuento para un exámen, y puesto que los examenes rondan los 180€, solamente esto ya amortiza el libro. Parece que ya no viene tal descuento en los libros.

  2. Fijad una fecha de examen en cuanto empecéis a estudiar (pero después de recibir el libro, para aprovechar el descuento del examen). La idea de tener una fecha límite ayuda mucho a no procrastinar con el estudio. Y si finalmente la fecha que habéis escogido os viene realmente mal, podéis cambiarla online hasta 24 horas antes.

He aprobado el primer examen de certificación MySQL

Este mediodía he ido a uno de los centros asociados de PearsonVUE para realizar el primer examen correspondiente a la certificación de desarrollador en MySQL 5.0. ¡Y lo he aprobado! (aquí la prueba, que se que hay mucho incrédulo suelto ;)) El aprobado estaba en acertar 43 de las 70 preguntas y he acertado 62.

Toma la tele de plasma y corre

De esta guisa se han encontrado nuestros "vecinos" de la academia de idiomas International House esta mañana uno de sus escaparates, donde solía haber una tele de plasma:

Me parece que alguien va a ver los partidos finales de la eurocopa en un flamante televisor de unas 40"...

Páginas