Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Usar IF en un INSERT

Estas en el tema de Usar IF en un INSERT en el foro de Mysql en Foros del Web. Hola amigos, Mi duda es la siguiente, deseo realizar un INSERT siempre y cuando el dato NO SE ENCUENTRE en la columna. Mi tabla es ...
  #1 (permalink)  
Antiguo 13/05/2013, 19:32
 
Fecha de Ingreso: septiembre-2010
Mensajes: 350
Antigüedad: 13 años, 6 meses
Puntos: 9
Exclamación Usar IF en un INSERT

Hola amigos,

Mi duda es la siguiente, deseo realizar un INSERT siempre y cuando el dato NO SE ENCUENTRE en la columna.

Mi tabla es la siguiente:

-----------
PERMISO
-----------
P1
P2
P3
...
P25

Entonces: Si introduzco el P1 no lo deberia de ingresar porque como ven ya existe el P1, caso contrario si ingreso P26 me deberia dejar ingresar el dato.

Mi codigo que realice pero no funciona es:
Código MySQL:
Ver original
  1. IF(SELECT * FROM tablaDePermisos WHERE PERMISO = 'P$i'),INSERT INTO ticketsPermiso(PERMISO) VALUES ('P$i''),''

La logica seria:
IF (Busco en mi tabla de permisos si hay un valor igual a P$i) , No lo hay hago insert , Si lo hay no hago nada

Que tengo mal ahi?

Muchas gracias amigos!
Saludos

Última edición por gnzsoloyo; 13/05/2013 a las 20:52
  #2 (permalink)  
Antiguo 13/05/2013, 20:54
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Usar IF en un INSERT

Cita:
Que tengo mal ahi?
Que ese tipo de operaciones no existe en MySQL.
Para realizarlas debes crear un stored procedure, o en su defecto realizar primero la consulta de validación, y de acuerdo al resultado enviar el INSERT.
Código MySQL:
Ver original
  1. DELIMITER $$
  2. CREATE PROCEDURE prueba(IN parametro VARCHAR(200)
  3.     IF (SELECT COUNT(1) FROM tablaDePermisos WHERE PERMISO = parametro) = 0 THEN
  4.         INSERT INTO ticketsPermiso(PERMISO) VALUES (parametro);
  5.     END IF;
  6. END $$
  7. DELIMITER ;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 14/05/2013, 02:05
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Usar IF en un INSERT

O simplemente crear un indice único sobre ese campo.... INSERT INTO ademas te informa de si se ha hecho la inserción o no, ya que retorna true o false ....
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #4 (permalink)  
Antiguo 15/05/2013, 08:01
 
Fecha de Ingreso: septiembre-2010
Mensajes: 350
Antigüedad: 13 años, 6 meses
Puntos: 9
Exclamación Respuesta: Usar IF en un INSERT

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Que ese tipo de operaciones no existe en MySQL.
Para realizarlas debes crear un stored procedure, o en su defecto realizar primero la consulta de validación, y de acuerdo al resultado enviar el INSERT.
Código MySQL:
Ver original
  1. DELIMITER $$
  2. CREATE PROCEDURE prueba(IN parametro VARCHAR(200)
  3.     IF (SELECT COUNT(1) FROM tablaDePermisos WHERE PERMISO = parametro) = 0 THEN
  4.         INSERT INTO ticketsPermiso(PERMISO) VALUES (parametro);
  5.     END IF;
  6. END $$
  7. DELIMITER ;
Hola gnzsoloyo!,

Muchas gracias por la ayuda!!, voy a probarlo hoy mismo saliendo del trabajo xD y les hare llegar mi resultado :)
Solo una duda en estas lineas:

Código MySQL:
Ver original
  1. DELIMITER $$

El Delimiter $$ -> Significa que incia el stored procedure? Siempre se pone $$?
prueba$$ -> Asi se nombran las variables? vairable$$ ?

Entonces tendria que poner antes esto?:

Código MySQL:
Ver original
  1. DELIMITER $$
  2. prueba = 'P1' (en caso de ser dentro de un for en php 'P$i')

Asi seria?

Gracias master!!
  #5 (permalink)  
Antiguo 15/05/2013, 08:08
 
Fecha de Ingreso: septiembre-2010
Mensajes: 350
Antigüedad: 13 años, 6 meses
Puntos: 9
Exclamación Respuesta: Usar IF en un INSERT

Cita:
Iniciado por quimfv Ver Mensaje
O simplemente crear un indice único sobre ese campo.... INSERT INTO ademas te informa de si se ha hecho la inserción o no, ya que retorna true o false ....
Hola quimfv!

Es una buena idea, pondria vacio el valor correspondiente al indice si no esta el permiso y si esta solo lo ingreso en ese mismo indice, no se me habia ocurrido xD, tienes razon es otra forma de hacerlo, creo que me gusta complicarme la vida a veces xDD.

Pero bueno me sirvio para que gnzsoloyo me apoyara conociendo mas los stored procedures, ahora bien, en cuestion de performance creo seria mas efectiva esta forma que el soterd procedure vdd ? porque solamente recorriendo el ciclo en php validaria si el permiso esta check o no y sobre eso modifico y ya no recorro todos los valores con el stored procedure

Gracias a todos!
  #6 (permalink)  
Antiguo 15/05/2013, 11:21
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Usar IF en un INSERT

Cita:
El Delimiter $$ -> Significa que incia el stored procedure? Siempre se pone $$?
No.
DELIMITER cambia momentáneamente el delimitador de sentencias (din de sentencia), para permitir la carga del código completo como una sola cosa. Por eso se pone al principio y luego se restaura el normal, al final.

Cita:
prueba$$ -> Asi se nombran las variables? vairable$$ ?
Tampoco.
Las variables dentro de un SP no tienen prefijos o sufijos obligatorios. Al menos no en MySQL.
Sólo se necesitas prefijos para variables de cierto tipo especial, como es la arroba (@) y no se usan para ningún tipo de variable local de un SP, ni tampoco para parámetros de entrada o salida.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 16/05/2013, 01:34
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Usar IF en un INSERT

Cita:
Es una buena idea, pondria vacio el valor correspondiente al indice si no esta el permiso y si esta solo lo ingreso en ese mismo indice, no se me habia ocurrido xD, tienes razon es otra forma de hacerlo, creo que me gusta complicarme la vida a veces xDD.
No se si me has entendido me refiero a

http://www.w3schools.com/sql/sql_create_index.asp

http://dev.mysql.com/doc/refman/5.0/...ate-index.html
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #8 (permalink)  
Antiguo 17/05/2013, 22:09
 
Fecha de Ingreso: septiembre-2010
Mensajes: 350
Antigüedad: 13 años, 6 meses
Puntos: 9
Respuesta: Usar IF en un INSERT

Hola,

Pues bueno les cuento ingrese el stored procedure en el motor mysql de cpanel y me muestra los siguiente:

Código MySQL:
Ver original
  1. DELIMITER $$
  2.     DROP PROCEDURE IF EXISTS prueba$$# MySQL ha devuelto un conjunto de valores vacío (es decir: cero columnas).
  3.  
  4.     CREATE PROCEDURE prueba(IN PERMISO VARCHAR(200))
  5.     BEGIN
  6.         IF (SELECT COUNT(1) FROM ticketsPermiso WHERE PERMISO = 'P26') = 0 THEN
  7.             INSERT INTO ticketsPermiso(PERMISO) VALUES ('P26');
  8.         END IF;
  9.     END $$# MySQL ha devuelto un conjunto de valores vacío (es decir: cero columnas).
  10.  
  11.     DELIMITER ;

# MySQL ha devuelto un conjunto de valores vacío (es decir: cero columnas).
No Inserta el valor en la tabla :S solo me aparece eso..
Que tengo mal ahi??
  #9 (permalink)  
Antiguo 18/05/2013, 07:19
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Usar IF en un INSERT

CPanel es una interfaz bastante poco habitual, y no estoy seguro de cómo se hace exactamente para cargar un SP desde ella. Pero si tiene elementos comunes a phpMyAdmin, por ejemplo, debe indicarse en alguna parte cuál es el delimitador de sentencias, y solamente poner el cuerpo del SP

Si ese es el caso, lo siento, pero normalmente no usamos CPanel como administrador de bases de datos, normalmente se usa el phpMyadmin para ello, y en ese caso tiene una forma de indicarse que tome correctamente los SP.

Lo que sí tienes que tener en cuenta es que crear un stored procedure es una acción que no devuelve datos. Es una ejecución que sólo responde por existo o error. Por ello no se ejecuta como una consulta normal.
Un detalle es que algunas interfases ya tienen incorporado métodos específicos para la carga de SP.
Busca en el manual
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 18/05/2013 a las 07:25

Etiquetas: insert, select, tabla, usar
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:43.