Página 1 de 1

Número de la fila consultada

NotaPublicado: 2006-11-30 11:15 @510
por AkonD
Holas. Ando haciendo un script que sincroniza bases de datos.

Necesito saber qué entradas aún no existen en la base de datos remota; lo que hago es lo siguiente:

Me conecto a la db remota y selecciono la última entrada que existe, y con el id de esa entrada selecciono la misma entrada en la db local.

Necesito saber el número de la fila selecionada en la db local para luego hacer una consulta que devuelva las filas más nuevas que esa.

He estado probando con la sentencia rows del dbi pero eso devuelve el número de filas que la consulta selecciona, lo que necesito saber es la posición de la fila para luego seleccionar las entradas más nuevas...

Si alguien tiene idea se agradecería mucho :D

Salu2 amigos.

NotaPublicado: 2006-11-30 11:22 @515
por monoswim
¿ Cuál es el index de la tabla ? Porque me resultaría más lógico seleccionar el último en la base vieja y luego seleccionar los más nuevos de la nueva y meterlos en la vieja...

¿ Pero si hay updates en la DB ? ¿Por qué no mejor crear y restorear backups ?

Saludos

NotaPublicado: 2006-11-30 11:35 @524
por AkonD
Es lo que hago, selecionar el último de la db central (que es la vieja) y luego mi intención es seleccionar los más nuevos que el último de la vieja.
El index no sé... yo sé que hay 2 "primary keys"
Sintáxis: [ Descargar ] [ Ocultar ]
Using sql Syntax Highlighting
CREATE TABLE `captures2006_11` (
  `pk` char(16) NOT NULL DEFAULT '0',
  `sensorID` char(6) NOT NULL DEFAULT '',
  `machineID` char(6) NOT NULL DEFAULT '',
  `alarma` tinyint(3) UNSIGNED NOT NULL DEFAULT '0',
  `alarmaID` char(6) DEFAULT NULL,
  `state` tinyint(3) UNSIGNED NOT NULL DEFAULT '0',
  `value` double NOT NULL DEFAULT '0',
  PRIMARY KEY  (`pk`,`sensorID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Y sobre los updates, no hay updates, es para unos barcos que van haciendo capturas con sensores y por cada captura añaden una entrada en la db. El script que estoy haciendo es para sincronizar los datos de los barcos con los de la base naval.

salu2

NotaPublicado: 2006-11-30 13:05 @587
por explorer
¿No hay ningún campo que sea del tipo autonumérico? Entonces sería muy fácil.

Otra forma de hacerlo. Si en la primera db seleccionamos la última entrada quiere decir que es lo mismo que si le preguntamos a la db cuántas filas hay. Eso se puede saber con SELECT COUNT(*) FROM ... (como pone en el manual de DBI, al hablar de rows).

Luego, en la segunda db se puede hacer un select y con LIMIT decir a partir de dónde queremos que nos dé los datos.

NotaPublicado: 2006-12-01 11:06 @504
por AkonD
Muchas gracias explorer ya consegui solucionarlo gracias a tu comentario :)

Ahora me encuentro con otro problema:

Como os dije el script es para sincronizar dos dbs, si os fijais en el estructura sql de la tabla hay 2 columnas que son Primary key.

Cuando intento insertar los datos en la db vieja para que este actualizada me salta error de duplicación de entradas ya que inserto entradas con el mismo valor en la columna `pk` o 'machineID'.

La cosa esta en que tienen que haber distintas entradas con el mismo valor en dichas columnas y son primary key, como puedo apañarmelas sin modificar las estructura de la tabla ya que la utiliza otro programa y no es posible modificarla.

Salu2

NotaPublicado: 2006-12-01 11:15 @511
por explorer
No puedes.

Como mucho, usando UPDATE en lugar de INSERT, reemplazarías las entradas antiguas por las modernas en las que coincidiesen los valores de 'pk' y 'machineID'. Al ser 'Primary keys', no puede haber repeticiones.

NotaPublicado: 2006-12-01 11:29 @520
por AkonD
No se trata de reemplazar ya que son entradas nuevas. El problema es que estas nuevas tienen valores en esas dos columnas que ya existen en entradas viejas.

Yo he pensado en un ALERT TABLE antes y después de la sincronización pero sigue sin funcionar, la sentencia que usado es:

Sintáxis: [ Descargar ] [ Ocultar ]
Using sql Syntax Highlighting
ALTER TABLE $table DROP PRIMARY KEY
 
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Sigue dandome el mismo error de duplicación de entrada

NotaPublicado: 2008-08-06 04:46 @240
por elnico
Hola. Tengo una pregunta relacionada.
¿Cómo hiciste para conectarte a una db remota con DBI?

Yo estoy intentando con este código:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use DBI;
my $dbh = DBI->connect ('DBI:mysql:database=test;host=192.168.0.1', 'root', 'mipassword');
print "CONECCION: ".$dbh."<br> \n";
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Pero no me muestra nada. Estoy intentando con una máquina de la misma red interna. Las dos usan Windows y tengo instalado los módulos DBI y DBD::mysql. Además cuando lo pruebo local me anda bien.

Gracias de antemano.

NotaPublicado: 2008-08-06 05:44 @281
por elnico
Hola de nuevo.
Acabo de encontrar una solución(¡se me caen las lágrimas de la emoción!)

En este foro explican cómo cambiarle los permisos al mysql:

http://php.org.pe/index.php?topic=259.msg777

Espero que le sirva a alguien más que mire esto.
Saludos,