2008-10-03 25 views
15

¿Hay una mejor manera de ver las nuevas entradas en una tabla además de seleccionar cada una de ellas o algo así?Viendo una tabla para cambiar en MySQL?

Tengo una tabla que un programa externo actualiza muy a menudo, y los clientes pueden mirar estos nuevos datos cuando llegan, ¿cómo puedo hacer eso sin tener que establecer un período fijo de declaraciones selectivas repetibles?

Respuesta

7

En MySQL no hay mejor manera que realizar sondeos (sin embargo, usted crea una tabla específica para simplificar el sondeo), en otras bases de datos puede tener activadores que tengan impacto fuera de la base de datos. En MySQL, triggers solo puede hacer cosas dentro de la base de datos (por ejemplo, completar la tabla de ayuda).

-3

si conoce suficiente SQL ... podría escribir Desencadenadores y alarmas.

+0

¿Puede desencadenar el envío fuera de la base de datos? No recuerdo que lo hagan, ¿puedes explicar más? –

+0

No lo creo así para mysql. – itsmatt

+1

¿Pueden los disparadores escribir en un archivo? Si es así, podría usar inotify para ver el archivo e invocar un programa cuando se haya actualizado. –

6

Esto es lo que hago: Tengo algunos desencadenantes configurados para la tabla (insertar, eliminar, actualizar) y esos desencadenantes incrementan un contador en otra tabla. Mi código de acceso a la BD conserva un contador local y lo compara con el valor devuelto, enviando finalmente un bool a la persona que llama, respondiendo la pregunta IsDataCurrent().

Nuestros programas que usan este código de acceso a la base de datos sondean o lo consultan a pedido y luego hacen las llamadas apropiadas para mantenerse actualizados.

Estoy seguro de que hay otras formas de solucionar esto. Sin embargo, funcionó bastante bien para mí.

+0

Por lo tanto, todavía requiere sondeo, solo un poco mejor para sondear: seleccione * de lastupdatetable; versus conteo select (*) de datatable; – davr

+3

No estoy de acuerdo. El recuento de selección de consulta (*) puede producir resultados erróneos. Si realizo un add/a delete/y un add, el conteo será el mismo, ¿verdad? Entonces, ¿los datos cambiaron? No lo sabrías en ese caso. La última tabla de actualización no producirá esta situación. – itsmatt

+0

Pero todavía requiere seleccionar cada n ticks, pero eso sería más económico que seleccionar la tabla de datos real, eso también lo estoy considerando. –

1

Esto es solo una pequeña mejora en su método. Escriba un activador en la (s) tabla (s) que está viendo para actualizar una tabla Last_Changed.

6

Otro enfoque similar sería añadir

add column Last_Modified TIMESTAMP ON UPDATE CURRENT_TIMESTAMP DEFAULT CURRENT_TIMESTAMP 

a cada mesa y preceda sus consultas de selección para comparar la última solicitud de fecha/hora con el máximo (last_modified).

bases de datos son típicamente tirón fuentes y no empuje por lo que aún tendrá que sondear mediante programación para los cambios no importa qué.

-4

nodejs + websockets hará el truco!

6

Es posible para activar el comportamiento fuera de la base de datos, si tiene el control del host.

A) This question's answer suggests escribir en un archivo usando 'select into archivo_salida' con un poco de proceso del sistema ver ese archivo de cambios (por ejemplo, podría ser suficiente inotify enfoque basado tales como node-inotify o incluso un Grunt-watch)

B) Para El valiente: The answer to this question señala que si puede instalar complementos C/C++ en su servidor de base de datos, puede usar una Función definida por el usuario (UDF) para llamar a sys_exec() y desencadenar procesos externos, o presumiblemente escribir el proceso real directamente en el UDF.

http://dev.mysql.com/doc/refman/5.0/en/faqs-triggers.html#qandaitem-B-5-1-11

(estoy investigando esto en el momento, para una aplicación alojada en AWS RDS por lo que lamentablemente ninguna de estas opciones son adecuadas para mí.)

Cuestiones relacionadas