2009-11-30 7 views
7

Tengo una tabla mnesia con tres campos, I, A y B, creado mediante el registroErlang: Mnesia: Actualización de un único valor de campo en una fila

-record(rec, {i, a,b}). 

Ahora insertar una fila en la tabla como :

mnesia:transaction(fun() -> mnesia:write("T", #rec{i=1, a=2, b=3}, write) end). 

Ahora qué hago si quiero actualizar esta fila, y cambiar sólo el valor de una a 10, dejando i y B con los mismos valores? ¿Hay algún equivalente SQL como "UPDATE T SET a=10 WHERE i=1"?

Si hago algo como esto:

mnesia:transaction(fun() -> mnesia:write("T", #rec{i=1, a=10}, write) end) 

La fila se almacena como:

{rec,1,10,undefined} 

Respuesta

9

El valor de esta función se actualizará a si se utiliza en un mnesia: transacción

update_a(Tab, Key, Value) -> 
    fun() -> 
    [P] = mnesia:wread({Tab, Key}), 
    mnesia:write(P#pixel{a=Value}) 
    end. 

Sugerencia: tener un vistazo a QLC si quieres un poco de azúcar sintaxis que se parece más a la sintaxis SQL.

El rendimiento es, por supuesto, el mejor punto de referencia, pero QLC tiene gastos generales, no estoy seguro de que sean relevantes en comparación con los otros detalles. Acabo de imaginar que el ejemplo de SQL que me dio actualizaría todos los registros que tienen i=1. Usar QLC para extraer ese conjunto de registros es más bonito que las llamadas de mnesia.

También para notar, wread reclama un bloqueo de escritura en el registro directamente, porque sabemos de antemano que actualizaremos ese registro. Es una micro-optimización para evitar primero un bloqueo de lectura, luego cambiar de opinión y obtener un bloqueo de escritura. Sin embargo, no lo he comparado en mucho tiempo.

Si el rendimiento sigue siendo un problema, debe considerar varios enfoques donde utiliza operaciones sucias. Pero deberías tratar de calcular cuántas transacciones por segundo necesitas, para ser 'lo suficientemente rápido'.

+0

Tengo que vigilar la eficiencia, ¿me recomendaría usar QLC o el método que ha especificado anteriormente? – ErJab

+0

Intenté esto, y por alguna razón no funciona. El valor no se está actualizando. – ErJab

+0

@ErJab, echa un vistazo a dirty_update_counter, podría servir a sus necesidades. – Zed

2

Creo que necesita para leer la "fila", actualizar cualquier campo que necesita, y luego escriba el resultado y todas estas operaciones dentro de una "transacción".

+0

Sí, pensé en eso también, pero ¿no sería una operación costosa? – ErJab

+0

La base de datos normalmente haría operaciones de "ACTUALIZACIÓN" en una transacción de todos modos o, de lo contrario, ¿cómo garantizarían la corrección? En 'mnesia' creo que uno tiene que ser más explícito, por alguna razón que se me escapa en este momento. – jldupont

Cuestiones relacionadas