¿Cómo puedo saber la siguiente clave primaria gratuita de algún modelo?Próxima clave primaria disponible del modelo
Respuesta
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.
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.
No, el ID no es MAX (COLUMN_NAME) 1. –
Sí, tienes razón. Debería haberlo comprobado, ya que sería una gran idea para cualquier base de datos multiusuario hacer eso. –
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?
this fragmento sin duda le ayudará.
-Uso Django y Mysql
next_id = Table.objects.filter (id__gt = current_id) [0] .id
- 1. clave primaria versus clave
- 2. clave primaria compuesta
- 3. clave externa cakephp no la clave primaria
- 4. Usar clave primaria compuesta como clave externa
- 5. Clave primaria de datos principales
- 6. Hibernar, alterar identificador/clave primaria
- 7. Actualización de MySQL primaria clave
- 8. clave primaria compuesta de PostgreSQL
- 9. clave primaria sql e índice
- 10. Clave primaria compuesta, clave externa. ¿Referencia a objeto o clave?
- 11. DiscriminatorColumn como parte de la clave primaria/Identificación del
- 12. Rieles - Anular la clave primaria en has_one
- 13. NHibernate - Nombre ¿Restricción de clave primaria?
- 14. restricción de violación de clave primaria
- 15. tabla no tiene una clave primaria
- 16. modelo de usuario de django y campo de clave primaria personalizada
- 17. Clave primaria múltiple de ScalaQuery y clave externa
- 18. clave externa Hibernate como parte de la clave primaria
- 19. Compuesto/clave primaria/única compuesta con Django
- 20. Clave primaria y externa al mismo tiempo
- 21. ¿La clave primaria SQL puede aceptar '0'?
- 22. APP primaria de auto clave generar
- 23. Inserto de Linq sin clave primaria
- 24. Clave primaria basada en el año?
- 25. clave primaria compuesta e índices adicionales
- 26. Clúster frente a clave primaria no agrupada
- 27. Comparta clave primaria autoincrementada entre dos tablas
- 28. ¿Falsifica una clave primaria compuesta? Rails
- 29. Modelo de recurso de Magento para la tabla con clave primaria compuesta
- 30. Enfoque en la próxima vista de clave válida en iPhone
Ah, la riqueza del conocimiento. –
Guau, gracias, gracias por una explicación tan detallada. – user20955