2009-02-24 16 views

Respuesta

17

Incluso si puede consultar el siguiente valor de clave primaria disponible, no lo ayudaría. A menos que bloquee la tabla, no puede usar ese valor antes de que algún otro cliente de base de datos pueda tomarla para su inserción.

En su lugar, solo debe insertar su fila, y luego puede consultar el más reciente clave de valor generado durante la sesión actual. Cada base de datos que admite claves primarias generadas automáticamente proporciona un método para recuperar la clave más reciente insertada durante su sesión.

La parte "durante la sesión" es importante porque protege su sesión de cualquier inserción realizada simultáneamente por otros clientes. Pueden generar valores clave y su sesión continuará reportando el mismo valor que insertó más recientemente.

@Stuart Childs supposes que MySQL genera la siguiente ID con MAX(column_name)+1 pero esto es incorrecto. Supongamos que inserta una fila y se genera un valor de ID. Pero revierte este inserto, o subsecuentemente DELETE esa fila. La próxima vez que inserte, MySQL generará un nuevo valor de ID. Por lo tanto, el valor de ID es uno mayor que el último valor de ID generado por cualquier cliente, independientemente de las filas almacenadas actualmente en la tabla.

Del mismo modo si lo inserta pero no lo hace de inmediato. Antes de comprometerse, algún otro cliente hace una inserción. Tanto su sesión como la del otro cliente tendrán su propio valor ID único generado. Las claves primarias generadas automáticamente funcionan independientemente del aislamiento de la transacción, para garantizar la exclusividad.

Los valores de claves primarias generados automáticamente no se vuelven a usar ni a asignar a más de una sesión, incluso si aún no ha confirmado su inserción, o si ha retrotraído la inserción, o si elimina la fila.

+0

Ah, la riqueza del conocimiento. –

+0

Guau, gracias, gracias por una explicación tan detallada. – user20955

-1

Creo que tendrá que ejecutar algunos custom SQL. El SQL que necesita será específico de DB. Por lo que sé, no hay una manera confiable de hacer esto en MySQL. Puede obtener la última ID de inserción, pero es específica de la sesión (es decir, puede obtener la ID del último registro que insertó en su sesión de base de datos, pero no la última ID de otra sesión que pudo haber sucedido después de la suya). Sin embargo (y alguien me corrige si estoy equivocado), MySQL genera el siguiente ID con MAX (column_name) + 1 para que pueda hacer lo mismo.

PostgreSQL hace que sea mucho más fácil con su sequence manipulation functions.

Editar:

Resulta que yo estaba pensando en AUTO_INCREMENT columnas dentro de un multi-column keycuales son generados con MAX (nombre_columna) 1. Sin embargo, aún se mantiene el punto de que no hay forma de recuperar el siguiente ID antes de que es generado por un inserto, que era la pregunta original.

+0

No, el ID no es MAX (COLUMN_NAME) 1. –

+0

Sí, tienes razón. Debería haberlo comprobado, ya que sería una gran idea para cualquier base de datos multiusuario hacer eso. –

0

Tuve esta misma pregunta porque estaba duplicando un elemento y quería cambiar su pk por uno nuevo para poder insertarlo.

Mi solución fue la siguiente:

import copy 
objectCopy=copy.copy(object) 
objectCopy.pk=None 
objectCopy.save() 

Es decir, si save() lo hace por usted, ¿por qué quieres hacerlo de forma manual?

-1

this fragmento sin duda le ayudará.

2

-Uso Django y Mysql

next_id = Table.objects.filter (id__gt = current_id) [0] .id

Cuestiones relacionadas