• Publicidad

Número de la fila consultada

Todo acerca de las bases de datos que existen: SQL, MySQL, Oracle, Postgres, CSV, etc.

Número de la fila consultada

Notapor AkonD » 2006-11-30 11:15 @510

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.
Última edición por AkonD el 2006-11-30 11:37 @526, editado 1 vez en total
AkonD
Perlero nuevo
Perlero nuevo
 
Mensajes: 50
Registrado: 2005-10-06 06:36 @316
Ubicación: España

Publicidad

Notapor monoswim » 2006-11-30 11:22 @515

¿ 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
MonoSwim
Perl Programming Language
Avatar de Usuario
monoswim
Perlero nuevo
Perlero nuevo
 
Mensajes: 452
Registrado: 2003-11-18 16:13 @717
Ubicación: Buenos Aires

Notapor AkonD » 2006-11-30 11:35 @524

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
AkonD
Perlero nuevo
Perlero nuevo
 
Mensajes: 50
Registrado: 2005-10-06 06:36 @316
Ubicación: España

Notapor explorer » 2006-11-30 13:05 @587

¿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.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor AkonD » 2006-12-01 11:06 @504

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
Última edición por AkonD el 2006-12-01 11:27 @519, editado 1 vez en total
AkonD
Perlero nuevo
Perlero nuevo
 
Mensajes: 50
Registrado: 2005-10-06 06:36 @316
Ubicación: España

Notapor explorer » 2006-12-01 11:15 @511

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.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor AkonD » 2006-12-01 11:29 @520

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.001 segundos, usando GeSHi 1.0.8.4


Sigue dandome el mismo error de duplicación de entrada
AkonD
Perlero nuevo
Perlero nuevo
 
Mensajes: 50
Registrado: 2005-10-06 06:36 @316
Ubicación: España

Notapor elnico » 2008-08-06 04:46 @240

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.003 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.
elnico
Perlero nuevo
Perlero nuevo
 
Mensajes: 69
Registrado: 2007-09-09 14:44 @656

Notapor elnico » 2008-08-06 05:44 @281

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,
elnico
Perlero nuevo
Perlero nuevo
 
Mensajes: 69
Registrado: 2007-09-09 14:44 @656


Volver a Bases de datos

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados

cron