SQL - En Violacion de Clave aumenta Campo Incremental

 
Vista:

En Violacion de Clave aumenta Campo Incremental

Publicado por Andrés (4 intervenciones) el 14/01/2003 18:57:04
El tema es el sig. en una tabla tengo un campo lamado serial que es incremental, y tengo otro campo lamado ID que es clave primaria.
En una aplicacion hecha en Delphi, al intentar grabar un registro con la clave primaria duplicada, me devuelve el error de Violacion de clave y no me inserta nada, Hasta ahi estaria todo correcto, el problema surge que cuando se produce un violacion de clave el campo serial que es incremental se incrementa en uno y en realidad al producirce la violacion de clave no se inserta ningun registro, por consecuencia no es logico que el campo incremental se incremente en uno para la proxima vez que ingrese un registro correcatmente.
Ejemplo.
1)_ Campos 'serial' tipo incremental, campo ID tipo texto y clave primaria.
2)_Supongamos que el ultimo registro en la tabla el campo serial contiene el nro de serie 1, si yo ahora tratara de ingresar un registro duplicado se produce la violacion de clave, no se inserta nada pero erroneamente se me incrementa el campo serial, y si ahora ingresara un registro correctamente se guardaria todo bien solo que el campo serial me salteo el Nro 2, y me puso el Nro 3.

Muchas gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:En Violacion de Clave aumenta Campo Incremental

Publicado por Isaías Islas (5072 intervenciones) el 14/01/2003 19:22:56
Andres

Ya habia comentado al respecto de esta situación, explico un poco mas.

Una Columna de tipo IDENTITY debera ser declarada como PRIMARY KEY para evitar lo que usted dice, tome el siguiente ejemplo:

CREATE TABLE PRUEBASIDENTITY (Id INT IDENTITY(1,1) PRIMARY KEY, Nombre varchar(15))
INSERT INTO PRUEBASIDENTITY VALUES('ROSITA')
SELECT * FROM PRUEBASIDENTITY
INSERT INTO PRUEBASIDENTITY VALUES('ADRISS')
--Intento insertar una fila ya existente
INSERT INTO PRUEBASIDENTITY VALUES(2,'MITZI')

Server: Msg 8101, Level 16, State 1, Line 1
An explicit value for the identity column in table 'PRUEBASIDENTITY' can only be specified
when a column list is used and IDENTITY_INSERT is ON.
INSERT INTO PRUEBASIDENTITY VALUES('CLARA')
SELECT * FROM PRUEBASIDENTITY

Id Nombre
----------- ---------------
1 ROSITA
2 ADRISS
3 CLARA

(3 row(s) affected)

Aunque claramente estoy intentando violar la regla de LLAVE UNICA, al ser mi columna PRIMARY KEY, no incrementa mi columna INCREMENTAL.

Espero que sirva mi comentario al respecto.

Saludos.

Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:En Violacion de Clave aumenta Campo Incremental

Publicado por Andrés (4 intervenciones) el 14/01/2003 20:10:46
Si en su ejemplo yo altero la tabla y al campo nombre lo declaro Indice Unico (unique), y ejecuto el sigiente Sql..
1)_INSERT INTO PRUEBASIDENTITY VALUES('ROSITA')
Lo hace bien en la tabla quedaria Serial = 1, Nombre = rosita
2)_ El mismo Sql INSERT INTO PRUEBASIDENTITY VALUES('ROSITA')
Me dice error por violacion de clave en el campo Nombre ya existe 'ROSITA' y como el campo nombre es un indice unico esto estaria bien, ya que estoy intentando forzar un Indice unico.
3)_INSERT INTO PRUEBASIDENTITY VALUES('ELEFANTE')
Este registro lo ingresa correctamente pero el resultado de este Sql queda de la sig manera: serial = 3 , Nombre = 'ELEFANTE'
Cuando en realidad el resultado deberia ser igual a:
serial = 2 , Nombre 'ELEFANTE'

Nota. claramente el campo serial se incrementa en uno cuando se produce este error.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:En Violacion de Clave aumenta Campo Incremental

Publicado por Isaías Islas (5072 intervenciones) el 14/01/2003 21:53:30
Tienes razon Andres, nunca (hasta ahora) habia realizado la prueba, NO lo se, tal vez sea algun bug de SQL, ¿Como solucionarlo?

Creo que hay forma, colocar un simple IF antes de realizar la instruccion INSERT:

IF EXISTS(SELECT MyColumna FROM MyTabla WHERE MyColumna = 'ADRISS'
BEGIN
SELECT 'ERROR, AL INSERTAR LLAVES DUPLICADAS'
RETURN(0)
END

Si alguien tiene la solucion o una mejor opinion, bienvenida.

Saludos.

Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:En Violacion de Clave aumenta Campo Incremental

Publicado por EDELRIO (540 intervenciones) el 14/01/2003 23:52:09
Yo realmente los campos incrementados no los recomiendo, yo mas bien utilizo el uso de foliadores para controlar el folio por medio de una tablita y no que el folio me lo controle el sistema..

saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar