FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
#1
|
|||
|
|||
Escribo en éste hilo porque me parece pertinente frente a mi problema, hasta ahora he trabajado la inserción de registros en tablas MySQL con campos llave AutoIncrement simplemente no asignándole valor, el asunto ahora es que eso funciona para un solo registro, pero cuando debo crear 2 o más, el primer Post pasa sin problema pero el segundo arroja un error de 'Key Violation' porque como el AutoIncrement es llave primaria, 2 valores NULL o '' no pueden coexistir.
He buscado soluciones pero no logro entenderlas, alguien puede comentar cómo ha podido solucionar dicho inconveniente ..? Saludos. |
#2
|
||||
|
||||
Mejor crea un tema nuevo, no es exactamente el mismo problema, además esto es de hace 6 años.
|
#3
|
||||
|
||||
Yo utilizo MySQL y nunca he tenido problemas con campos autoincrementados, simplemente ni siquiera los incluyo en los inserts y dejo que el motor haga lo suyo. Desde que creo la tabla dejo los valores por defecto para los campos autoincrementados. Cada vez que se hace un insert y se agrega una tupla si no se indica el valor del campo autoincrementado MySQL automáticamente lo inserta y coloca el valor correspondiente. Sin embargo si incluyes el campo y le das un valor (aunque sea cero) MySQL lo insertará sin alterar el contador del autoincrementado, es decir, si el campo va en 99 e insertamos un valor de 150, MySQL nos lo aceptará y agregará correctamente la fila pero el contador seguirá quedando en 99 que fue el último valor autoincrementado. El problema lo tendremos cuando llegue a 150 porque nos arrojará un error de clave duplicada (recordemos que los campos autoincrementados deben ser claves primarias).
__________________
AKA "El animalito" ||Cordobés a mucha honra|| |
#4
|
|||
|
|||
AzidRain, y nunca ha tenido problemas cuando necesita grabar 2 registros (2 Post) antes de hacer un ApplyUpdates ?
En mi caso debo crear algo así como el detalle de una factura, entonces creo el encabezado (factura) (1 Post) y luego el detalle (DetalleFactura) que son varios registros (varios Post), cuando se completa la operación debo hacer el Apply, pero en el 2do Post me sale el error 'Key Violation' |
#5
|
||||
|
||||
El error te sale porque estas tomando y asumiendo que el valor que tienes en folio o clave de las 2 facturas que estás editando es el mismo. La clave la debes obtener hasta que ya vayas a guardar el encabezado y posteriormente pasarla al detalle. Para ello puedes hacer lo siguiente, grabas la cabecera (sin indicar la clave o folio) inmediatamente despues obtienes que número le fue asignado usando "LAST_INSERT_ID" y ya con ese número actualizas el detalle y lo guardas y listo. "LAST_INSERT_ID" te devolverá siempre el último valor autoincrementado que te asignó el motor sin importar si otros usuarios antes o después que tú hicieron lo mismo. Ojo, tienes que abrir una transacción para hacer todo esto para que si ocurre cualquier error no te quedes con una cabecera sin detalle.
En resumidas cuentas tienes que hacer toda tu operación SIN saber que clave le corresponde a la cabecera, eso lo dejas hasta el final. Al usuario si quiere le muestras el folio asignado hasta el momento en que terminas las actualizaciones a la BD, antes NO.
__________________
AKA "El animalito" ||Cordobés a mucha honra|| |
#6
|
|||
|
|||
AzidRain, gracias por la recomendación es muy pertinente, sin embargo la PRIMARY KEY de la tabla Detalle es un campo AUTOINCREMENT, es decir, independiente de saber o no la clave de la cabecera, esa no es la clave principal, sino el campo AutoInc de la misma tabla Detalle cuyo valor no conozco en ese momento, de hecho el NroFactura (Id de la respectiva tabla cabecera) lo manejo desde otra tabla de consecutivos, por lo que al grabar el datalle si conozco el NroFactura.
|
#7
|
||||
|
||||
Yo creo que no necesitas el autoincrement en la tabla de detalle ya que muy seguramente la estructura de la tabla ya incluye como clave foránea el número de factura. Podría ser una clave compuesta que incluya el número de factura y el número de línea de detalle, el cual no tiene que ser autoinc. ya que no necesitas llevar la cuenta de cuantas líneas has insertado en todas las facturas sino solo en cada una. De esta manera podemos identificar cada fila como única a partir de su número de factura y número de línea.
Sería bueno ver la estructura de las 2 tablas
__________________
AKA "El animalito" ||Cordobés a mucha honra|| |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Auto carga de clases en PHP 5 | dec | PHP | 1 | 08-03-2008 22:37:13 |
EAN 128 Auto Switch ?? | ofillia | Varios | 2 | 02-02-2007 19:07:03 |
auto incremento | valentino | MySQL | 1 | 14-02-2005 12:59:33 |
Auto borrado | brandolin | Varios | 6 | 27-09-2003 21:18:37 |
Auto Crear Forma | cmgenny | Varios | 2 | 13-05-2003 13:46:03 |
|