Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Insertar datos cuando una tabla tiene col con identity (https://www.clubdelphi.com/foros/showthread.php?t=29323)

La__X 19-01-2006 02:15:35

Insertar datos cuando una tabla tiene col con identity
 
Holas,
He estado buscando sin suerte, como hacer para insertar datos en una tabla que tiene una columna con identity P.J:
TDepartamento
IDdpto int identity (1,1)
IDNombreDpto varchar etc etc
Quiero hacer un SP para insertar pero mi gran duda es como hago para la col IDdpto? Deberia hacer una funcion que me devuelva el ultimo IDdpto q tengo registro y apartir de ese resultado insertarlo para registrar un nueva fila? o alguna forma un takin + facil?
GraX:D

cuburu 19-01-2006 02:39:50

Quizas...
 
Podrías utilizar el Store procedure para almacenar los datos que necesites hacer de forma manual y despues utilizar un trigger Before insert para identificar el último registro que se encuentra almacenado en tu Tabla.

Ahorita no me acuerdo bien de la sintaxis pero lo que debes de hacer es asignar un generador al campo que deseas incrementar basandote en su último valor, así que resumiendo, deberías de documentarte un poco en buscar los siguientes conceptos de bases de datos:

Generadores.
Triggers ó disparadores.
Llamadas y creación de procedimientos.

te recomiendo le heches un vistazo a la pagina www.firebird.com.mx/ en la seccion de artículos/articulos sobre firebird e Interbase. Vienen muchos PDF's sobre como hacer esto que te dije.

Suerte.:cool:

Neftali [Germán.Estévez] 19-01-2006 09:45:51

Cita:

Empezado por La__X
...como hacer para insertar datos en una tabla que tiene una columna con identity.
...un SP para insertar pero mi gran duda es como hago para la col IDdpto?

Tal vez no te he entendido bien, pero si es una columna identity no debes darle valor; Ahí está la gracia de éste tipo de Datos, que el SGBD se encarga de colocarlos.
Realiza el insert omitiendo ese valor.

La__X 19-01-2006 18:05:40

Pero...
 
Cita:

Empezado por Neftali
Tal vez no te he entendido bien, pero si es una columna identity no debes darle valor; Ahí está la gracia de éste tipo de Datos, que el SGBD se encarga de colocarlos.
Realiza el insert omitiendo ese valor.

Estructura de TDistrito
IDdistrito int identity(1,1) ..... -------------> esta en mi col problema
Idnombredistrito
iddepartamento etc etc


--Este es mi SP:
CREATE PROCEDURE InsertaDistrito
@NombreProvincia varchar (20),
@NombreDistrito varchar (20)
as
insert into TDistrito values ( ????,@NombreDistrito,@NombreProvincia)
go

Se tengo q registrar tres datos para una fila de TDistrito como hago para la columna que es identity???????

Neftali [Germán.Estévez] 19-01-2006 18:12:25

Simplemente no lo pongas (utiliza los nombre de campo).

Código SQL [-]
insert into TDistrito (Idnombredistrito, iddepartamento,...) 
values (@NombreDistrito,@NombreProvincia,...)

La__X 19-01-2006 19:10:40

Cita:

Empezado por Neftali

Código SQL [-]
insert into TDistrito (Idnombredistrito, iddepartamento,...) 
values (@NombreDistrito,@NombreProvincia,...)

ISi funciono :D
Graciassssss
Y de Casualidad Como Hago para reiniciar ese identity,
osea por ejemplo he borrado sus unicos 10 registros.. como hago para una vez vacia se reinicie en 1?? :p

fabianbbg 19-01-2006 20:18:50

hola:

Si mal no recuerdo vos trabajas con un SQL Server 2000, ahora que pudiste insertar registros, para saber el ultimo ID

(identity) generado se consulta con :

Código SQL [-]
  
 Insert into nombre_tabla ...    
 declare @id  int
 set @id=ident_current('nombre_tabla')
 select @id


Con este código, tenes en @ID el valor del ultimo identidad generado para esa tabla, lo podrias colocar todo dentro de un SP , y cuando este se ejecute te devuelva el Id generado..

Con respecto a "volver" el contador autoincremental al valor de inicialización:
Podes usar TRUNCATE TABLE nombre_tabla : truncate borra todos los registros de la tabla y le devuelve la "marca de agua" inicializando la identidad, que es lo que vos queres.
El inconveniente es que la tabla no debe tener relaciones de clave foranea para que el truncate funcione, sino da error.

Asi que tendrias que eliminar las relaciones y volver a crearlas luego del truncate, podrias hacer todo en un solo script.

La otra que te queda es eliminar el campo.. y volver a crearlo, eso inicializaria el contador tambien..

Espero te sirvan las sugerencias...
Exitos..

La__X 19-01-2006 21:06:04

Hay una forma de resetar:
DBCC CHECKIDENT ('Nombre_de_la_Tabla'‚ RESEED‚ 1)
Pero el chiste es que solo se pueda hacer cuando el identity no es clave primaria y no es referenciada por otra tabla.
Creo q voy a tener q hacer lo q me recomendo fabianbbg, quitar momentaneamente las relaciones...hacer un truncate y reeestableces las relaciones.. lamentablemnt hara que este proceso se ponga lento cuanda haya muchos registros :(.
Espero encontrar alguna otra sol
Gracias por las Rptas

fabianbbg 20-01-2006 00:19:47

holas:
Escribiste:
Cita:

Empezado por La__X
Pero el chiste es que solo se pueda hacer cuando el identity no es clave primaria y no es referenciada por otra tabla.


Che.. ¿pero es necesario usar el identity como dato en tu aplicación? , o sea mostrar ese nro al usuario y considerarlo en la logica de tu programa¿?

Te pregunto porque si vos no lo mostras.. no hace falta tener que reiniciar el contador..

Por ahi si lo que necesitas es un numero consecutivo o una secuencia cronologica, tal vez seria mejor calcular ese número.

Lo que te recomiendo si.. es no mostrar la clave primaria de la tabla al usuario final.

Espero soluciones tus problemas
EXITOS!

La__X 20-01-2006 15:04:01

[quote=fabianbbg]holas:
Che.. ¿pero es necesario usar el identity como dato en tu aplicación? , o sea mostrar ese nro al usuario y considerarlo en la logica de tu programa¿?
quote]
:rolleyes:
Obviamente que no voy a mostrar el PK al usuario porq no le sirve y no entenderia el proposito del numero, lo que pasa es que pensando a futuro.. cuando el identity llegue a su tope?, o cuando hagan un vaciado de BD, me parece que estaria bien que si borran todos los registros al llenar otra vez la tabla deberia comienzas en uno de nuevo, (eso para el q administre la BD).
Entretanto sigo pensando la mejor forma de arreglar esto, porque de todas maneras lo quieren :(

fabianbbg 21-01-2006 00:27:23

Hola

Cita:

Empezado por La__X
cuando el identity llegue a su tope?,
(

mm pero mira que que el identity puede ser grande grande... llegaran a tantos registros?

del ayuda del SQL:
Cita:


bigint

Datos enteros (números enteros) comprendidos entre -2^63 (-9223372036854775808) y 2^63 -1 (9223372036854775807). El tamaño de almacenamiento es 8 bytes.

int

Datos enteros (números enteros) comprendidos entre -2^31 (-2.147.483.648) y 2^31 - 1 (2.147.483.647). El tamaño de almacenamiento es 4 bytes. El sinónimo en SQL-92 para int es integer


La franja horaria es GMT +2. Ahora son las 15:55:22.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi