Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] On duplicate key update

Estas en el tema de On duplicate key update en el foro de PHP en Foros del Web. Buenas, yo puedo hacer esto: //creating an sql query $sql = "INSERT INTO users (token,email) VALUES ('$token','$email')" ." ON DUPLICATE KEY UPDATE token = '$token';" ...
  #1 (permalink)  
Antiguo 10/06/2016, 01:09
 
Fecha de Ingreso: abril-2016
Mensajes: 15
Antigüedad: 8 años, 7 meses
Puntos: 0
On duplicate key update

Buenas, yo puedo hacer esto:

//creating an sql query
$sql = "INSERT INTO users (token,email) VALUES ('$token','$email')"
." ON DUPLICATE KEY UPDATE token = '$token';"
." ON DUPLICATE KEY UPDATE email = '$email';";

Tengo tanto como token y email como unicas y quiero que no se repitan al hacer un insert...se hace asi?
  #2 (permalink)  
Antiguo 10/06/2016, 01:50
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 10 meses
Puntos: 606
Respuesta: On duplicate key update

Si no quieres que se repitan, lo más seguro es incluir una restricción UNIQUE a nivel de base de datos.
__________________
Aviso: No se resuelven dudas por MP!
  #3 (permalink)  
Antiguo 10/06/2016, 02:15
 
Fecha de Ingreso: abril-2016
Mensajes: 15
Antigüedad: 8 años, 7 meses
Puntos: 0
Respuesta: On duplicate key update

Cita:
Iniciado por Malenko Ver Mensaje
Si no quieres que se repitan, lo más seguro es incluir una restricción UNIQUE a nivel de base de datos.
si, a nivel de base de datos es unique(tanto el token como el email), pero lo que pasa que a veces en el mismo dispositivo lo usa otro usuario, entonces el token es el mismo para los dos en ese momento, pero lo que quiero es que al iniciar este usuario sesion como usa el mismo token al ser el mismo movil, pues que machaque ese token con el email del usuario nuevo...y entonces el token pasa a ser suyo.
  #4 (permalink)  
Antiguo 10/06/2016, 02:31
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 10 meses
Puntos: 606
Respuesta: On duplicate key update

En tal caso podrías hacer que el unique sea sobre los dos campos, no?
__________________
Aviso: No se resuelven dudas por MP!
  #5 (permalink)  
Antiguo 10/06/2016, 03:47
 
Fecha de Ingreso: abril-2016
Mensajes: 15
Antigüedad: 8 años, 7 meses
Puntos: 0
Respuesta: On duplicate key update

Cita:
Iniciado por Malenko Ver Mensaje
En tal caso podrías hacer que el unique sea sobre los dos campos, no?
Si, asi lo tengo:

CREATE DATABASE fcm;

USE fcm;

CREATE TABLE users (
id int(20) NOT NULL AUTO_INCREMENT,
Token varchar(200) NOT NULL,
Email varchar(200) NOT NULL,
PRIMARY KEY (id),
UNIQUE KEY (Token)
UNIQUE KEY (Email)
);

pero no se como hacer lo del php para que cuando sea el token el mismo pero el email distinto simplemente actualice la tabla con el nuevo email, dejando el mismo token.
  #6 (permalink)  
Antiguo 10/06/2016, 05:56
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: On duplicate key update

La idea NO ES que hagas un UNIQUE sobre cada campo, sino que generes un índice UNIQUE sobre ambos al mismo tiempo, como una sola clave compuesta.
Código MySQL:
Ver original
  1. CREATE TABLE users (
  2. Token varchar(200) NOT NULL,
  3. Email varchar(200) NOT NULL,
  4. UNIQUE KEY (Token, Email)
  5. );

Por cierto, este tema es OFF TOPIC en el foro de PHP. Sería mejor verlo en los de Bases de Datos...
__________________
¿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 10/06/2016, 07:26
 
Fecha de Ingreso: abril-2016
Mensajes: 15
Antigüedad: 8 años, 7 meses
Puntos: 0
Respuesta: On duplicate key update

Entiendo, abro el hilo en bases de datos?. El caso que no atino a realizar bien el insert me da error por donde pruebe.
  #8 (permalink)  
Antiguo 10/06/2016, 07:44
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 10 meses
Puntos: 606
Respuesta: On duplicate key update

Duplicar hilos va en contra de las reglas del foro, así que mejor que te muevan el hilo. Cuando decía un unique sobre los dos campos me refería a como te ha explicado gnzsoloyo, no a crear dos unique sobre cada campo.

En cualquier caso, has aplicado el cambio y lo has probado antes de pensar siquiera en abrir otro hilo?
__________________
Aviso: No se resuelven dudas por MP!
  #9 (permalink)  
Antiguo 10/06/2016, 10:35
 
Fecha de Ingreso: abril-2016
Mensajes: 15
Antigüedad: 8 años, 7 meses
Puntos: 0
Respuesta: On duplicate key update

Cita:
Iniciado por Malenko Ver Mensaje
Duplicar hilos va en contra de las reglas del foro, así que mejor que te muevan el hilo. Cuando decía un unique sobre los dos campos me refería a como te ha explicado gnzsoloyo, no a crear dos unique sobre cada campo.

En cualquier caso, has aplicado el cambio y lo has probado antes de pensar siquiera en abrir otro hilo?
Si probe, esto:

$sql = "INSERT INTO users (token,email) VALUES ('$token','$email')"
." ON DUPLICATE KEY UPDATE token = '$token' and email ='$email';"

Me sobreescribia el token(bien), pero el email seguia siendo el antiguo. De todas formas hasta el lunes no puedo seguir indagando...
  #10 (permalink)  
Antiguo 10/06/2016, 10:44
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 10 meses
Puntos: 606
Respuesta: On duplicate key update

Vamos, que gnzsoloyo se ha tomado las molestias en escribirte como has de crear el unique y ni lo has aprobado que ya querías abrir otro hilo? Así va a ser complicado ayudar...
__________________
Aviso: No se resuelven dudas por MP!
  #11 (permalink)  
Antiguo 10/06/2016, 11:04
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: On duplicate key update

Cita:
Iniciado por MrEnfurecido Ver Mensaje
Si probe, esto:

$sql = "INSERT INTO users (token,email) VALUES ('$token','$email')"
." ON DUPLICATE KEY UPDATE token = '$token' and email ='$email';"

Me sobreescribia el token(bien), pero el email seguia siendo el antiguo. De todas formas hasta el lunes no puedo seguir indagando...
La verdad es que ni siquiera lo estás razonando...

Si tienes la tabla definida de esta forma:
Código MySQL:
Ver original
  1. CREATE TABLE users (
  2. Token varchar(200) NOT NULL,
  3. Email varchar(200) NOT NULL,
  4. UNIQUE KEY (Token, Email)
  5. );
Y haces esto:
Código MySQL:
Ver original
  1. INSERT INTO users (token,email) VALUES ('$token','$email')
es absolutamente imposible que exista una duplicación de clave, porque la PK es el campo declarado como AUTO_INCREMENT, y es el único valor tomado como KEY, con lo que SIEMPRE será un valor diferente...

¿Se entiende?

Haznos el favor de borrar la tabla y crearla según te indico. Luego, vuelve a probar.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #12 (permalink)  
Antiguo 10/06/2016, 16:07
 
Fecha de Ingreso: abril-2016
Mensajes: 15
Antigüedad: 8 años, 7 meses
Puntos: 0
Respuesta: On duplicate key update

Cita:
Iniciado por gnzsoloyo Ver Mensaje
La verdad es que ni siquiera lo estás razonando...

Si tienes la tabla definida de esta forma:
Código MySQL:
Ver original
  1. CREATE TABLE users (
  2. Token varchar(200) NOT NULL,
  3. Email varchar(200) NOT NULL,
  4. UNIQUE KEY (Token, Email)
  5. );
Y haces esto:
Código MySQL:
Ver original
  1. INSERT INTO users (token,email) VALUES ('$token','$email')
es absolutamente imposible que exista una duplicación de clave, porque la PK es el campo declarado como AUTO_INCREMENT, y es el único valor tomado como KEY, con lo que SIEMPRE será un valor diferente...

¿Se entiende?

Haznos el favor de borrar la tabla y crearla según te indico. Luego, vuelve a probar.
No puedo probarlo hasta el lunes, pero si que entiendo lo que dices.

Lo que pasa que el valor del token es el mismo si no cambias de dispositivo entonces al hacer el insert me daba error porque el token ya estaba en la base de datos.

Cuando pueda lo pruebo y os comento.. Gracias y perdón por las molestias
  #13 (permalink)  
Antiguo 10/06/2016, 16:49
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: On duplicate key update

Sigues sin entenderlo...

¿Sabes de qué estoy hablando cuando te digo "una sola clave compuesta"?
Una clave puede estar compuesta de una sola columna, o más de una. La forma de definirla está en relación directa con la forma de identificar un único registro entre todos los registros de la tabla.
En tu caso, la tabla USERS, al definirse como UNIQUE el par (token, email), hace que la combinación de un token dado, con un e-Mail determinado sólo puede registrarse una vez, pero cada token y cada eMail pueda aparecer N veces.

Supongamos que el token tuviese el valor "abcdefg", y el email fuese diferente en cada caso.
Esto sería válido en ese caso:

Código MySQL:
Ver original
  1. ID | TOKEN | EMAIL
  2. 1 | abdcefg | [email protected]
  3. 2 | abdcefg | [email protected]
  4. 3 | abdcefg | [email protected]
  5. 4 | abdcefg | [email protected]
  6. 5 | kjhjhyy | [email protected]
  7. 6 | kjhjhyy | [email protected]

Pero con esos cuatro registros no podrías hacer este insert:
Código MySQL:
Ver original
  1. INSERT INTO users (token,email) VALUES ('abdcefg', '[email protected]')
no podrías ingresarlo porque el par de valores ya existe en el indice UNIQUE.

Por favor, son temas de manual. Te conviene leer un poco de indices en BBDD antes de seguir. Evitarás dar vueltas sobre un asunto cuya solución ya te hemos dado.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #14 (permalink)  
Antiguo 11/06/2016, 04:01
 
Fecha de Ingreso: abril-2016
Mensajes: 15
Antigüedad: 8 años, 7 meses
Puntos: 0
Respuesta: On duplicate key update

Vale, ya lo entiendo. Entonces lo haré de otra manera. Actualizando los tokens y emails de cada usuario cada vez que inicien sesión, borrando antes el antiguo.

Y cuando cierren sesion pues que borren su fila con el token/email correspondiente. Total solo harán conexion una vez al mes o un par mas...

O simplemente cuando logueen, buscar en la tabla el token y el email y si ya existe pues que no haga nada y si no, que haga el insert/update correspondiente.
  #15 (permalink)  
Antiguo 14/06/2016, 15:01
 
Fecha de Ingreso: abril-2016
Mensajes: 15
Antigüedad: 8 años, 7 meses
Puntos: 0
Respuesta: On duplicate key update

$sql = "INSERT INTO users (token,email) VALUES ('$token','$email')"
." ON DUPLICATE KEY UPDATE token = '$token', email= '$email';"

y la tabla:

CREATE TABLE users (
id int(20) NOT NULL AUTO_INCREMENT,
Token varchar(200) NOT NULL,
Email varchar(200) NOT NULL,
PRIMARY KEY (id),
UNIQUE KEY ( Email)
);

asi consigo lo que buscaba, gracias.

Etiquetas: duplicate, key, sql, 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 12:20.