PDA

Ver la Versión Completa : auto increment


einarcito
13-10-2008, 23:59:44
hola chicos una pregunta, tengo una tabla con un capo id de auto_incremente, tengo un problema a la hora de cargar los datos. aca les dejo un ejemplo

alta_proveedor:='INSERT INTO proveedores VALUES(: pid, : pfax,: pdom,:pman,: ppiso,: ptel,: pcuit,: prazon,: pprov,:p local,:p cp,:p correo,:p web';
with dm.abmCompras do begin
sql.Clear;
sql.Add(alta_proveedor);
ParamByName('pdi').Value:=null;
ParamByName('pfax').Value:=editfax.Text;
ParamByName('pdom').Value:=editdomicilio.Text;
y asi sucesivamente hasta q cargo todos los datos...

el campo :pid q muestro ahi es el auto increment, eh intentado de esta manera insertando en ese campo un null pero me da error... tengo entendido q no hace hace falta cargar ni siquieda pasarle en null por el solo hecho q se incrementa solo, q tendria q hacer?? gracias

roman
14-10-2008, 00:08:26
Por favor, usa las etiquetas adecuadas para publicar tu código.

En cuanto a la pregunta, intenta pasarle 0 al parámetro.

// Saludos

einarcito
14-10-2008, 00:12:38
q no se entendio? las caritas se formaron porq todos los parametros llevan un : p precedido, ah por sierto probe con asiganrle el 0 sigo con el mismo error :(:(:(:(

rgstuamigo
14-10-2008, 00:13:28
Hola einarcito, me gustaria saber en que servidor de base de datos estas trabajando.:confused:
Pero aqui va una sugerencia:
Verifica que el campo que tienes como autoincrement sea por defecto null, por si no es asi no podras pues fijate que no este declarado como not null:rolleyes:. por que si no no aceptará valores nulos , ademas si siquiera debes enviarle datos, pues automaticamente se incrementa cada ves que insertas una tupla;)

einarcito
14-10-2008, 00:20:40
estoy con mysql server 5 oye tengo otro eemplo y lo tengo definido como null y lo mismo anda el auto incrementador asi q creo q no es el problema, le asige cero y tmb me sigue dando error :(

rgstuamigo
14-10-2008, 00:33:28
Entonces amigo por que no pusiste tu duda en el foro de MySQL (http://www.clubdelphi.com/foros/forumdisplay.php?f=21) .:confused: Halla te ayudarian mejor ya que son unos Master
Pero Que error te sale?
O si no no le mandes nada y el servidor te lo hara solo

egostar
14-10-2008, 00:43:49
q no se entendio? las caritas se formaron porq todos los parametros llevan un : p precedido, ah por sierto probe con asiganrle el 0 sigo con el mismo error

Hola

roman se referia a que no se entiende bien asi como lo pones, con las etiquetas se ve así:



alta_proveedor:='INSERT INTO proveedores VALUES(:pid,:pfax,:pdom,:pman,:ppiso,:ptel,:pcuit,:prazon,:pprov,:plocal,:pcp,:pcorreo,:pweb)';

with dm.abmCompras do begin
sql.Clear;
sql.Add(alta_proveedor);
ParamByName('pdi').Value := null;
ParamByName('pfax').Value := editfax.Text;
ParamByName('pdom').Value := editdomicilio.Text;
// Y demas parámetros.....
end;

Tal vez requiere de que asignes los campos en la misma sentencia



alta_proveedor:= 'INSERT INTO proveedores (pid,pfax,pdom,pman,ppiso,ptel,pcuit,prazon,pprov,plocal,pcp,pcorreo,pweb)'+
' VALUES(:pid,:pfax,:pdom,:pman,:ppiso,:ptel,:pcuit,:prazon,:pprov,:plocal,:pcp,:pcorreo,:pweb)';



Salud OS

PD: Para evitar ver las caritas debes de agregar la etiqueta



....

einarcito
14-10-2008, 01:43:11
egopolice tmb eh probado eso y no funciona, a ver mi pregunta es deberia cargar ese dato??? me contesto a mi mismo CREO q no porq por algo es autoincremente, entonces mi otra pregunta es como deberia declarar eso dentro de mi codigo???

egostar
14-10-2008, 01:47:25
egopolice tmb eh probado eso y no funciona, a ver mi pregunta es deberia cargar ese dato??? me contesto a mi mismo CREO q no porq por algo es autoincremente, entonces mi otra pregunta es como deberia declarar eso dentro de mi codigo???

Hola

Me parece que no es necesario cargar ese campo, segun se ve en este hilo (http://www.clubdelphi.com/foros/showthread.php?t=52616&highlight=autoincremento)

Salud OS

PablorD
14-10-2008, 06:14:29
prueba con esto.


alta_proveedor:='INSERT INTO proveedores VALUES(:id,:fax,:dom,:man,:piso,:tel,:cuit,:razon,:prov,:local,:cp,:correo,:web)';
//saque las p para que no hiciera :P, tienes que ponerlas denuevo
with dm.abmCompras do begin
sql.Clear;
sql.Add(alta_proveedor);
ParamByName('pdi').Value := 'null';
ParamByName('pfax').Value := editfax.Text;
ParamByName('pdom').Value := editdomicilio.Text;
//y asi sucesivamente hasta q cargo todos los datos...

o con esto



ParamByName('pdi').Value := '';

//y asi sucesivamente hasta q cargo todos los datos...

Lepe
14-10-2008, 08:22:31
egostar ya ha dado la respuesta correcta, no le deis más vueltas.

Tienes que omitir el campo que es autoinc del sql. Si lo incluyes, entonces se aplican otras reglas:
- si le das el valor null y el campo no admite nulos, excepción al canto.
- si le das el valor null y el campo admite nulos (cosa que nunca debería ocurrir en este caso) almacenará el nulo y después es probable que tengas otros errores.
- Si le das un valor distinto de nulo, lo grabará y podrá incurrir en key violation o en violación de índices únicos.

Saludos

roman
14-10-2008, 16:26:24
No tenía muchas ganas de intervenir nuevamente en este hilo, pero quiero acotar, respecto a lo que dice Lepe, que uso con frecuencia este tipo de campos en MySQL, y puedo asegurar que si se le pasa un valor cero, el motor genera el incremento correcto. Esto funciona así, tanto desde una aplicación usando componentes como ZEOS o MyDAC, o bien desde el cliente mismo de MySQL.

Lo uso mucho así, precisamente para no tener que escribir todos los campos en la sentencia.

Incluso, leyendo el manual (http://dev.mysql.com/doc/refman/4.1/en/numeric-types.html), se ve esto:

When you insert a value of NULL (recommended) or 0 into an indexed AUTO_INCREMENT column, the column is set to the next sequence value

No sé si esto es no-estándar o si funcione en otros motores, pero así funciona en MySQL.

// Saludos

gustavosv
15-05-2014, 01:14:12
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.

Casimiro Notevi
15-05-2014, 09:53:53
....
Mejor crea un tema nuevo, no es exactamente el mismo problema, además esto es de hace 6 años.

AzidRain
17-05-2014, 22:36:51
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).

gustavosv
18-05-2014, 15:08:35
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'

AzidRain
19-05-2014, 22:27:54
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.

gustavosv
19-05-2014, 22:47:44
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.

AzidRain
21-05-2014, 00:20:14
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

gustavosv
23-05-2014, 21:01:27
tema resuelto en el siguiente hilo: http://www.clubdelphi.com/foros/showthread.php?p=476477&mode=linear#post476477

Gracias a AzidRain por sus aportes ...