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

UPDATE si existe e INSERT si no existe renglon.

Estas en el tema de UPDATE si existe e INSERT si no existe renglon. en el foro de Mysql en Foros del Web. Estoy queriendo actualizar muchas filas a la vez. Pero queriendo insertar una nueva file si es que todavía no existe. La estructura de la tabla ...
  #1 (permalink)  
Antiguo 06/05/2010, 16:52
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 1 mes
Puntos: 101
UPDATE si existe e INSERT si no existe renglon.

Estoy queriendo actualizar muchas filas a la vez. Pero queriendo insertar una nueva file si es que todavía no existe.

La estructura de la tabla es así:

id (key) | phpvar | value | scope | language | author


Como ven, tengo al id como primary key.

Lo que tengo que actualizar es y "value", siempre y cuando "language" sea, por ejemplo, "en" y "phpvar" sea tal otra cosa.

En principio no cuento con el "id" a la hora de querer insertar los datos. Y el campo "phpvar" no puede ser unico (se repite para para idioma), así que no tengo manera de usar ON DUPLICATE KEY UPDATE.

Hay algun condicional inverso a ON DUPLICATE KEY UPDATE? Es decir, uno cuya logica sea UPDATE IF EXISTS? Necesitaría comprobar esto:

"phpvar"="tal" AND "language" = "en"

Si hay filas con esos valores, actualizar. Sino, insertar una nueva fila.

Gracias por adelantado.
  #2 (permalink)  
Antiguo 07/05/2010, 05:56
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: UPDATE si existe e INSERT si no existe renglon.

Puedes crear un indice unico compuesto con los dos campos.

Del manual

Cita:
12.2.5.3. INSERT ... ON DUPLICATE KEY UPDATE Syntax

If you specify ON DUPLICATE KEY UPDATE, and a row is inserted that would cause a duplicate value in a UNIQUE index or PRIMARY KEY, an UPDATE of the old row is performed. For example, if column a is declared as UNIQUE and contains the value 1, the following two statements have identical effect:

INSERT INTO table (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=c+1;

UPDATE table SET c=c+1 WHERE a=1;

...
En tu caso seria

Código MySQL:
Ver original
  1. INSERT INTO tutbla (value,phpvar,language) VALUES (x,"tal","en")

Suponiendo que has creado un indice unico con los dos campos


Sigue el mismo manual....

Cita:
12.1.8. CREATE INDEX Syntax

CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name
[index_type]
ON tbl_name (index_col_name,...)
[index_type]

index_col_name:
col_name [(length)] [ASC | DESC]

index_type:
USING {BTREE | HASH | RTREE}

....
Código MySQL:
Ver original
  1. CREATE UNIQUE INDEX index_phpvar_language
  2. ON tutabla (phpvar,language)

creo


Quim

Última edición por quimfv; 07/05/2010 a las 06:08
  #3 (permalink)  
Antiguo 07/05/2010, 08:22
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 1 mes
Puntos: 101
Respuesta: UPDATE si existe e INSERT si no existe renglon.

Ah! Gracias! Sabía que en teoría podía hacerse.

La verdad es que hasta hace poco mis nociones del modolo relacional eran pobres. Y aún ahorael manual se me hace muy dificil de seguir.

Asi que te agradezco me hayas aclarado el punto.

Lo pruebo.
  #4 (permalink)  
Antiguo 07/05/2010, 18:06
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 1 mes
Puntos: 101
Respuesta: UPDATE si existe e INSERT si no existe renglon.

Funcionó perfecto!

Etiquetas: existe, insert, renglon, update
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 16:08.