Programación al Extremo

Buscar en este blog

jueves, 2 de febrero de 2012

TRIGGER y subida avanzada de archivos load data local infile MYSQL
Fecha de Publicación:
Publicado por:
Seguir Seguir en twitter
Seguir Seguir en facebook
Seguir Seguir en Google+

Programación al Extremo : mysql
En el siguiente Tutorial vamos a aprender a realizar un TRIGGER en Mysql e insertar datos a la base de datos de una manera mas Optima y rápida con load data local infile.
El trigger es el encargado de llenar todas las tablas de las bases de datos con un archivo de texto plano en formato .csv
Lo primero que hacemos es crear la base de datos que es la siguiente:
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
--
-- Base de datos: `bdnarly`
--

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `asesor`
--

CREATE TABLE IF NOT EXISTS `asesor` (
  `ase_id` int(11) NOT NULL AUTO_INCREMENT,
  `ase_nom` varchar(100) NOT NULL,
  `ase_usu` varchar(50) NOT NULL,
  `ase_cla` varchar(50) NOT NULL,
  `ase_per` int(11) NOT NULL,
  PRIMARY KEY (`ase_id`),
  KEY `ase_usu` (`ase_usu`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;

--
-- Volcar la base de datos para la tabla `asesor`
--


-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `barrio`
--

CREATE TABLE IF NOT EXISTS `barrio` (
  `bar_id` int(11) NOT NULL AUTO_INCREMENT,
  `bar_idmun` int(11) NOT NULL,
  `bar_nom` varchar(250) NOT NULL,
  PRIMARY KEY (`bar_id`),
  KEY `bar_idmun` (`bar_idmun`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=252 ;

--
-- Volcar la base de datos para la tabla `barrio`
--


-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `catastro`
--

CREATE TABLE IF NOT EXISTS `catastro` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `CICLO` double DEFAULT NULL,
  `ESTRATO` varchar(255) DEFAULT NULL,
  `NIC` varchar(50) DEFAULT NULL,
  `NIS` varchar(50) DEFAULT NULL,
  `NOMBRE` varchar(255) DEFAULT NULL,
  `DIRECCION` varchar(255) DEFAULT NULL,
  `MUNICIPIO` varchar(255) DEFAULT NULL,
  `BARRIO` varchar(255) DEFAULT NULL,
  `CARTERA` double DEFAULT NULL,
  `FINANCIADO` double DEFAULT NULL,
  `SITUACION` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=90985 ;

--
-- (Evento) desencadenante `catastro`
--
DROP TRIGGER IF EXISTS `bdnarly`.`actualizarTodasLastablas`;
DELIMITER //
CREATE TRIGGER `bdnarly`.`actualizarTodasLastablas` AFTER INSERT ON `bdnarly`.`catastro`
 FOR EACH ROW begin 
set @municipio:=(select mun_id from municipio where (mun_nom)=(new.municipio));
set @barrio:='';
if(@municipio is null)then 

insert into municipio (mun_nom) values((new.municipio));

set @municipio:=(select mun_id from municipio where (mun_nom)=(new.municipio));

insert into barrio (bar_idmun ,bar_nom ) values ((@municipio),(new.barrio));

set @barrio:=(select bar_id from barrio where (bar_nom)=(new.barrio) limit 1);

else

set @barrio:=(select bar_id from barrio where (bar_nom)=(new.barrio) limit 1);

if(@barrio is null) then 

insert into barrio (bar_idmun,bar_nom) values ((@municipio),(new.barrio));

set @barrio:=(select bar_id from barrio where (bar_nom)=(new.barrio) limit 1);

end if;

end if;

set @ciclo:=(select cic_id from ciclo where (cic_id)=(new.ciclo));

if(@ciclo is null) then 

insert into ciclo (cic_id, cic_fec) values ((new.ciclo),now());

set @ciclo:=(select cic_id from ciclo where (cic_id)=(new.ciclo));

end if;



set @estrato:=(select est_id from estrato where (est_nom)=(new.estrato));

if(@estrato is null) then 

insert into estrato ( est_nom) values ((new.estrato));

set @estrato:=(select est_id from estrato where (est_nom)=(new.estrato));

end if;

set @situacion:=(select sit_id from situacion where (sit_nom)=(new.situacion));

if(@situacion is null) then 

insert into situacion ( sit_nom) values ((new.situacion));

set @situacion:=(select sit_id from situacion where (sit_nom)=(new.situacion));

end if;

set @cliente:=(select cli_id from cliente where (cli_nic)=(new.nic) 

and (cli_nis)=(new.nis));

if(@cliente is null) then 

insert into cliente ( cli_nis, cli_nic, clic_nom, cli_dir, cli_sit, cli_barid, cli_estid)

values ((new.nis),(new.nic),(new.nombre),(new.direccion),(

@situacion),(@barrio),(@estrato));

set @cliente:=(select cli_id from cliente where (cli_nic)=(new.nic) 

and (cli_nis)=(new.nis));

end if;



set @clienteciclo:=( SELECT clicic_id  FROM clienteciclo 

where (clicic_nis)=(new.nis)

and (clicic_nic)=(new.nic)

and (clicic_cic)= (new.ciclo)

);

if @clienteciclo is null then

insert into clienteciclo (clicic_nis, clicic_nic, clicic_cic, clicic_car, clicic_fin, clicic_ase)

values((new.nis),(new.nic),(new.ciclo),(new.cartera),(new.financiado),0);

end if;







end
//
DELIMITER ;

--
-- Volcar la base de datos para la tabla `catastro`
--


-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `ciclo`
--

CREATE TABLE IF NOT EXISTS `ciclo` (
  `cic_id` int(11) NOT NULL,
  `cic_fec` date NOT NULL,
  PRIMARY KEY (`cic_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- (Evento) desencadenante `ciclo`
--
DROP TRIGGER IF EXISTS `bdnarly`.`actualizarRegistro`;
DELIMITER //
CREATE TRIGGER `bdnarly`.`actualizarRegistro` AFTER INSERT ON `bdnarly`.`ciclo`
 FOR EACH ROW begin 
set @val:=( SELECT cliente.cli_nis FROM cliente where cli_nis=1
);
if(@val is null) then 
insert into registro (registro) values('suceso');
end if;
end
//
DELIMITER ;

--
-- Volcar la base de datos para la tabla `ciclo`
--


-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `cliente`
--

CREATE TABLE IF NOT EXISTS `cliente` (
  `cli_id` int(11) NOT NULL AUTO_INCREMENT,
  `cli_nis` varchar(50) NOT NULL COMMENT 'Numero de identificacion del cliente',
  `cli_nic` varchar(50) NOT NULL,
  `clic_nom` varchar(255) NOT NULL,
  `cli_dir` varchar(255) NOT NULL,
  `cli_sit` int(11) NOT NULL,
  `cli_barid` int(11) NOT NULL,
  `cli_estid` int(11) NOT NULL,
  PRIMARY KEY (`cli_id`),
  UNIQUE KEY `cli_nis` (`cli_nis`,`cli_nic`),
  KEY `cli_nic` (`cli_nic`),
  KEY `cli_barid` (`cli_barid`),
  KEY `cli_estid` (`cli_estid`),
  KEY `cli_sit` (`cli_sit`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=90985 ;

--
-- Volcar la base de datos para la tabla `cliente`
--


-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `clienteciclo`
--

CREATE TABLE IF NOT EXISTS `clienteciclo` (
  `clicic_id` int(11) NOT NULL AUTO_INCREMENT,
  `clicic_nis` varchar(50) NOT NULL,
  `clicic_nic` varchar(50) NOT NULL,
  `clicic_cic` int(11) NOT NULL,
  `clicic_car` double NOT NULL COMMENT 'cartera del cliente',
  `clicic_fin` double NOT NULL COMMENT 'Financiacion del cliente',
  `clicic_ase` int(11) NOT NULL DEFAULT '0',
  `clicic_cau` int(11) NOT NULL,
  `clicic_fecv` date NOT NULL DEFAULT '1000-01-01',
  `clicic_feca` date NOT NULL DEFAULT '1000-02-01',
  `clicic_des` varchar(255) NOT NULL,
  `clicic_tel` varchar(20) NOT NULL,
  `clicic_est` int(1) NOT NULL,
  PRIMARY KEY (`clicic_id`),
  UNIQUE KEY `clicic_nis_2` (`clicic_nis`,`clicic_nic`,`clicic_cic`),
  KEY `clicic_nis` (`clicic_nis`),
  KEY `clicic_cic` (`clicic_cic`),
  KEY `clicic_nic` (`clicic_nic`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=90985 ;

--
-- Volcar la base de datos para la tabla `clienteciclo`
--


-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `estrato`
--

CREATE TABLE IF NOT EXISTS `estrato` (
  `est_id` int(11) NOT NULL AUTO_INCREMENT,
  `est_nom` varchar(50) NOT NULL,
  PRIMARY KEY (`est_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=10 ;

--
-- Volcar la base de datos para la tabla `estrato`
--


-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `fecha`
--

CREATE TABLE IF NOT EXISTS `fecha` (
  `idfecha` int(11) NOT NULL,
  PRIMARY KEY (`idfecha`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Volcar la base de datos para la tabla `fecha`
--


-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `municipio`
--

CREATE TABLE IF NOT EXISTS `municipio` (
  `mun_id` int(11) NOT NULL AUTO_INCREMENT,
  `mun_nom` varchar(50) NOT NULL,
  PRIMARY KEY (`mun_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;

--
-- Volcar la base de datos para la tabla `municipio`
--


-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `registro`
--

CREATE TABLE IF NOT EXISTS `registro` (
  `registro` varchar(150) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Volcar la base de datos para la tabla `registro`
--


-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `situacion`
--

CREATE TABLE IF NOT EXISTS `situacion` (
  `sit_id` int(11) NOT NULL AUTO_INCREMENT,
  `sit_nom` varchar(150) NOT NULL,
  PRIMARY KEY (`sit_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ;

--
-- Volcar la base de datos para la tabla `situacion`
--


-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `visitascausales`
--

CREATE TABLE IF NOT EXISTS `visitascausales` (
  `viscau_id` int(11) NOT NULL AUTO_INCREMENT,
  `vis_nom` varchar(255) NOT NULL,
  PRIMARY KEY (`viscau_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=13 ;

--
-- Volcar la base de datos para la tabla `visitascausales`
--


--
-- Filtros para las tablas descargadas (dump)
--

--
-- Filtros para la tabla `barrio`
--
ALTER TABLE `barrio`
  ADD CONSTRAINT `barrio_ibfk_1` FOREIGN KEY (`bar_idmun`) REFERENCES `municipio` (`mun_id`) ON UPDATE CASCADE;

--
-- Filtros para la tabla `cliente`
--
ALTER TABLE `cliente`
  ADD CONSTRAINT `cliente_ibfk_4` FOREIGN KEY (`cli_sit`) REFERENCES `situacion` (`sit_id`) ON UPDATE CASCADE,
  ADD CONSTRAINT `cliente_ibfk_5` FOREIGN KEY (`cli_estid`) REFERENCES `estrato` (`est_id`) ON UPDATE CASCADE,
  ADD CONSTRAINT `cliente_ibfk_6` FOREIGN KEY (`cli_barid`) REFERENCES `barrio` (`bar_id`) ON UPDATE CASCADE;

--
-- Filtros para la tabla `clienteciclo`
--
ALTER TABLE `clienteciclo`
  ADD CONSTRAINT `clienteciclo_ibfk_1` FOREIGN KEY (`clicic_nis`) REFERENCES `cliente` (`cli_nis`),
  ADD CONSTRAINT `clienteciclo_ibfk_2` FOREIGN KEY (`clicic_cic`) REFERENCES `ciclo` (`cic_id`),
  ADD CONSTRAINT `clienteciclo_ibfk_3` FOREIGN KEY (`clicic_nic`) REFERENCES `cliente` (`cli_nic`);

Segundo Paso

Creamos una consulta la cual es la encargada de subir todos los datos , en cual el Trigger se encargara de repartir los datos por toda la base de datos.
ejecuta el siguiente Script desde la consola  de MYSQL o desde phpmyadmin

use bdnarly;

load data local infile'F:/CATASTRO.csv' REPLACE into table catastro fields terminated by ';' enclosed by '"'  lines terminated by '\r\n';

El trigger enpezara a llenar todas las tablas.

descarga el archivo bdnarly.sql.zip y el archivo catastro.csv de la siguiente dirección
pestaña archivos de descarga.

Publicar un comentario