entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

0voto

Pasar migración de php a mysql puramente

Buenos Días, dado el hecho que tenía en mi base da datos un muy mal diseño de Entidad Relación como bien me decía el maestro Tadei hace meses atras, ahora estoy haciendo la migración de mis tablas a la base de datos nueva pero como no tengo mucho conocimiento de mysql la estoy haciendo con php usando jquery con ajax y me gustaría hacerlo con una query o función de mysql:
Este es mi código en el modelo de mi migración: Aquí estoy migrando mi tabla de etiquetas de mi vieja db a mi nueva db:

public function migrar($id){
            $this->load->model('migracion_model');
            # Migrar las estiquetas y sus informaciones de la tabla vieja para la nueva     
            # 1. Recuperar la data de la Etiqueta de la tabla de la Tag t1
            $etiqueta = $this->db->from('tags1')->where('id',$id)->get()->row();
            # 2. Verificar si existe la Etiqueta en la Tabla Etiquetas y en caso de existir recuperar su id_tag         
            $id_tag = $this->Texist($etiqueta->nombre);
            # 3. Si existe la etiqueta -> Actualizar sus datos en caso de no Existir crearla con sus datos.
            if (is_null($id_tag)) {             
                #1 se inserta el tag en la tabla de tags
                $this->db->insert('tag',array(
                'nombre' => $etiqueta->nombre,
                    'id_idioma' => '1',
                'etiqueta' => $etiqueta->tag,
                'visitas' => $etiqueta->views));
                $id_tag = $this->db->insert_id();
             }else{             
                #1 Actualizar la cantidad de visitas que ha tenido la etiqueta
                $this->db->where('id',$id_tag);
                $this->db->update('tag', array('visitas' => $etiqueta->views));             
             }
         return 'Etiqueta: '.$etiqueta->nombre;
        }

        function Texist($tag){
            $etiqueta = $this->get_uri($tag); //me retorna el id de la etiqueta si existe           
            $this->db->select('id')->where('etiqueta',$etiqueta);
            return $this->db->from('tag')->limit(1)->get()->row()->id;          
        }

                public function get_uri($cadena){
            // Tranformamos todo a minusculas
            $find = array('Á', 'É', 'Í', 'Ó', 'Ú', 'Ñ', 'á', 'é', 'í', 'ó', 'ú', 'ñ');
            $repl = array('a', 'e', 'i', 'o', 'u', 'n', 'a', 'e', 'i', 'o', 'u', 'n');
            $url = str_replace ($find, $repl, $cadena);
            $url = strtolower($url);
            //Rememplazamos caracteres especiales latinos
            // Añadimos los guiones
            $find = array(' ', '&', '\r\n', '\n', '+');
            $url = str_replace ($find, '-', $url);
            // Eliminamos y Reemplazamos otros carácteres especiales
            $find = array('/[^a-z0-9\-<>]/', '/[\-]+/', '/<[^>]*>/');
            $repl = array('', '-', '');
            $url = preg_replace ($find, $repl, $url);
            return $url;
        }
}

1 Respuesta

0voto

carlossevi Puntos63580

Hola Dairon, no he podido probarlo pero he hecho un pequeño procedimiento que creo que hace lo que pides. Habrá que revisar que he implementado bien tu lógica pero a grandes rasgos la estructura deberá ser esa:

CREATE PROCEDURE MigrarEtiquetas()
BEGIN
    -- Variable para controlar el final:
    DECLARE done INT DEFAULT FALSE;
    -- Variables para almacenar los valores temporalmente
    -- DEBES REVISAR SI LOS TIPOS SE CORRESPONDEN!  
    DECLARE _idb, _views INT;
    DECLARE _nombre, _tag CHAR(16);

    -- Cursor para recorrer etiquetas:
    DECLARE curEtiquetas CURSOR FOR 
        SELECT 
            id,
            nombre,
            tag,
            views
        FROM tags1;

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

    -- Abrir el cursor:
    OPEN curEtiquetas;

    -- Empieza el bucle:
    read_loop: LOOP
        -- Tomar valores para procesar siguiente etiqueta:
        FETCH curEtiquetas INTO _id, _nombre, _tag, _views;     
        IF done THEN
            LEAVE read_loop;
        END IF;
        -- Comprobar si ya existe:
        IF EXISTS (SELECT * FROM tags WHERE nombre = _nombre) THEN
            -- Existe > Actualizar:
            UPDATE tags SET visitas = _views WHERE nombre = _nombre;
        ELSE
            -- No existe > Insertar:
            INSERT INTO tags (nombre, id_idioma, etiqueta, visitas) 
                VALUES (_nombre, '1', _tag, _views);
        END IF;
    END LOOP;

    CLOSE curEtiquetas;
END;

El procedimiento recorre todas los registros que devuelve el SELECT sobre la tabla "tags1" y va actualizando o insertando en la tabla "tags".

0voto

dairon comentado

Gracias Carlos lo probaré y nadamás que obtenga resultado te hago saber, aún estoy aprendiendo y siempre lo estaré ;)
Saludos Dairon

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta