Conduce Chile
General => De Todo Un Poco => Mensaje iniciado por: Mithrandir en Noviembre 15, 2011, 09:56:54 am
-
Estimados necesito saber como generar un id o cod primario automatico en una tabla por ejemplo esta tabla:
create table nombres (cod_usuario integer not null,
nombre varchar(20),
apellidos varchar (40),
primary key(cod_usuario))
ya que si la hago con identity este solo se incrementa y si necesito borrar un campo este no parte desde el codigo que se borro parte con el siguiente correlativo.
de antemano gracias
-
MySQL, Postgres o MSSQL?
Con postgres podrías crear un Trigger que se ejecute al eliminar un registro, luego de eso cuentas el Max(Id) y reestableces la secuencia.
Cuando alguien ingrese un registro tomará el valor de la secuencia.
Si estás usando MySql 5, creo que ya tiene triggers.
-
MySQL, Postgres o MSSQL?
Con postgres podrías crear un Trigger que se ejecute al eliminar un registro, luego de eso cuentas el Max(Id) y reestableces la secuencia.
Cuando alguien ingrese un registro tomará el valor de la secuencia.
Si estás usando MySql 5, creo que ya tiene triggers.
mssql
:?? :?? :?? :?? :?? :?? :?? :?? :?? :?? :??
-
mssql
:?? :?? :?? :?? :?? :?? :?? :?? :?? :?? :??
Microsoft SQL Server
-
... si es que entendi bien la pregunta...
o mas simple pue.. antes de insertar un registro nuevo, vas a leer el ID, con un max y lo incrementas en 1 (o en lo que corresponda)
y luego insertas el registro, eso es lo que se hace usualmente en cualquier motor de BD
-
Microsoft SQL Server
si ese pero al resto quede plop por eso puse esas caras :?? :?? :?? :?? :?? :?? :??
-
... si es que entendi bien la pregunta...
o mas simple pue.. antes de insertar un registro nuevo, vas a leer el ID, con un max y lo incrementas en 1 (o en lo que corresponda)
y luego insertas el registro, eso es lo que se hace usualmente en cualquier motor de BD
El problema con eso, es que si 2 procesos tratan de ingresar al mismo tiempo un registro podrías tener un Id duplicado.
si ese pero al resto quede plop por eso puse esas caras :?? :?? :?? :?? :?? :?? :??
Ah, Ok.
Lo que pasa es que puedes usar un disparador (Trigger) que ejecuta una función. Por ejemplo si creas un Trigger para cuando un usuario elimine la fila, este mandará a ejecutar un procedimiento almacenado. Por ejemplo:
--Este Trigger se ejecutará cada vez que se elimine un registro
Create Trigger mantiene_id On dbo.nombres For Delete
As
Declare @NuevoId int;
--Obtiene el último Id
Select @NuevoId = MAX(Id) From nombres;
--Resetea la secuencia
DBCC CHECKIDENT (nombres, RESEED, @NuevoId)
END
Cuando un usuario ingrese un nuevo registro, tomará el valor @NuevoId + 1.
-
Estimado
con la sentencia (NOLOCK), evitas que 2 procesos la ejecuten al mismo tiempo,
al hacer el select lo deja bloqueado hasta terminar
yo lo haria asi
Declare @IdNuevo int
Select @IdNuevo= MAX(Id) +1 From tabla (NOLOCK)
insert into tabla (campo1,campo2)
values (@IdNuevo, valor2)
-
independiente de la plataforma....
mm para eso esta el manejo de errores, que si intenta insertar un registro con la PK existente, realice la creacion de la PK de nuevo, de esta manera te das la "otra vuelta" solo en caso de error y no "por si acaso"
;)
eficiencia->eficacia
ahora si existe la instancia de bloquear los select... no se como funcionará para procesos concurrentes cuando quieras leer una tabla con varios millones de registros, pero...
pero cada maestrito con su librito
Como consejo Mith-zata siempre consideren el uso de indices y manejo de errores en los programas, es una buena practica, que al principio es pajera, pero pronto te acostumbras a trabajar "bien"
-
El problema con eso, es que si 2 procesos tratan de ingresar al mismo tiempo un registro podrías tener un Id duplicado.
Ah, Ok.
Lo que pasa es que puedes usar un disparador (Trigger) que ejecuta una función. Por ejemplo si creas un Trigger para cuando un usuario elimine la fila, este mandará a ejecutar un procedimiento almacenado. Por ejemplo:
--Este Trigger se ejecutará cada vez que se elimine un registro
Create Trigger mantiene_id On dbo.nombres For Delete
As
Declare @NuevoId int;
--Obtiene el último Id
Select @NuevoId = MAX(Id) From nombres;
--Resetea la secuencia
DBCC CHECKIDENT (nombres, RESEED, @NuevoId)
END
Cuando un usuario ingrese un nuevo registro, tomará el valor @NuevoId + 1.
ya ok, me quedo claro
Como consejo Mith-zata siempre consideren el uso de indices y manejo de errores en los programas, es una buena practica, que al principio es pajera, pero pronto te acostumbras a trabajar "bien"
a que te refieres con esto???????
-
ya ok, me quedo claro
a que te refieres con esto???????
Que una "pifia" usual cuando esta estudiando/partiendo es que en los programas (leguaje que sea) suele olvidar tomar en cuenta lo que el programa debe hacer cuando se cae o cuando sucede una situacion que el programa no sabe controlar.
por ejemplo(bien tirado de las mechas): supongamos que estas programando una división, tienes que hacer que el programa sepa que hacer cuando alguien quiera dividir por 0, no es la idea que el programa se vaya de espaldas asi como asi y que sea "culpa del usuario", sino que de antemano sepas "que puede salir mal" y hacer que el programa sepa como comportarse en esas instancias.
tal como se hablaba mas arriba de que una PK podia repetirse y el programa llegaría hasta ahi no mas, la idea es que si sucede eso, el programa solo busque la solución y cree otra pk que si se pueda insertar
eso
-
Que una "pifia" usual cuando esta estudiando/partiendo es que en los programas (leguaje que sea) suele olvidar tomar en cuenta lo que el programa debe hacer cuando se cae o cuando sucede una situacion que el programa no sabe controlar.
por ejemplo(bien tirado de las mechas): supongamos que estas programando una división, tienes que hacer que el programa sepa que hacer cuando alguien quiera dividir por 0, no es la idea que el programa se vaya de espaldas asi como asi y que sea "culpa del usuario", sino que de antemano sepas "que puede salir mal" y hacer que el programa sepa como comportarse en esas instancias.
tal como se hablaba mas arriba de que una PK podia repetirse y el programa llegaría hasta ahi no mas, la idea es que si sucede eso, el programa solo busque la solución y cree otra pk que si se pueda insertar
eso
okales me quedo mas claro
-
Que una "pifia" usual cuando esta estudiando/partiendo es que en los programas (leguaje que sea) suele olvidar tomar en cuenta lo que el programa debe hacer cuando se cae o cuando sucede una situacion que el programa no sabe controlar.
por ejemplo(bien tirado de las mechas): supongamos que estas programando una división, tienes que hacer que el programa sepa que hacer cuando alguien quiera dividir por 0, no es la idea que el programa se vaya de espaldas asi como asi y que sea "culpa del usuario", sino que de antemano sepas "que puede salir mal" y hacer que el programa sepa como comportarse en esas instancias.
tal como se hablaba mas arriba de que una PK podia repetirse y el programa llegaría hasta ahi no mas, la idea es que si sucede eso, el programa solo busque la solución y cree otra pk que si se pueda insertar
eso
deberiay ser informático...
-
Si es para efectos de estudio, estaría bien controlar errores mediante triggers... ahora no me imagino controlar los errores mediante triggers (en la bd) cuando tienes millones de registros.
Los sistemas de gestion de bases de datos controlan internamente el bloqueo de las tablas para las modificaciones que se realizan por tanto aquello de bloquear las tablas para hacer una modificación me parece que ya no se usa.
-
El LOCK lo usa el motor para impedir que dos usuarios efectúen una modificación en el mismo dato en el mismo momento; pero no tiene relación con obtener un dato, incrementarlo, y adicionar. Si dos usuarios usan un select max(id) from tabla, obtendrán el mismo valor. Si le adicionan uno y van a insertar, uno lo alcanzará a hacer, el otro error de duplicidad de llave.
Yo para estas cosas corté por lo sano: número autogenerado en campo ID, y si tengo que borrar me da lo mismo que no sean secuenciales, ya que solo se usan para indicar unívocamente un registro, pero más utilidad no debería tener. Es más ahora no les encuentro tanto sentido, para eso mejor modelar las PK y FK en el diseño lógico, y controlar con datos reales esto.
En el caso de los procesos de BI, acá utilizaron un secuenciador de PowerCenter para aumentar el número y es una paja, porque frecuentemente se pillan procesos y quedan sin insertar el dato. Adicional, que está mal implementado.