sql - valores - ¿Cómo inserto en una tabla y recupero el valor de la clave principal?
que es una clave principal en access (6)
¡¡¡Santo cielo!!!
simplemente llame a la función SCOPE_IDENTITY()
:
insert into your_talble(col1,col2) values(''blah'',''more blah'')
select scope_identity()
porque la selección del valor más alto devolverá un error si cualquier otra declaración realiza una inserción. la función scope_identity()
devuelve la identidad creada en el contexto actual (es decir, por su declaración)
Tengo una clave principal configurada para el incremento automático.
Estoy haciendo varias consultas y necesito recuperar ese valor de clave principal para usarlo como clave externa en otra tabla ( IsIdentity = TRUE
).
¿Hay alguna forma elegante de recuperar el valor de la clave principal cuando hago una consulta de inserción? En este momento estoy volviendo a consultar y obteniendo el valor más alto en esa columna, lo que parece realmente intrépido.
¿Alguna sugerencia?
Debes usar scope_identity (). Y recomiendo incluir la instrucción insert y scope_identity () en la transacción.
SCOPE_IDENTITY () es probablemente lo que quieres. Devuelve el ID del último registro insertado por el mismo contexto de código en el que se ejecuta.
IDENT_CURRENT (''nombre de tabla'') está sujeto a problemas de concurrencia. Es decir, no hay garantía de que no se inserte otro registro entre INSERT y la llamada a IDENT_CURRENT.
Debo confesar que no estoy seguro de a qué fuente de asombro se refiere el arrebato de VillageIdiot, pero me sorprende bastante que esta pregunta no parezca ser un duplicado.
Si está utilizando SQL Server 2005 o posterior, puede usar la cláusula OUTPUT.
create table T(
pk int identity primary key,
dat varchar(20)
);
go
insert into T
output inserted.pk
values (''new item'');
go
drop table T;
La salida se puede dirigir a una tabla, así como al cliente. Por ejemplo:
create table T(
pk int identity primary key,
dat varchar(20)
);
create table U(
i int identity(1001,1) primary key,
T_pk int not null,
d datetime
);
go
insert into T
output inserted.pk, getdate()
into U(T_pk,d)
values (''new item''), (''newer item'');
go
select * from T;
select * from U;
go
drop table T, U;
A partir de SQL Server 2008, puede utilizar "DML composable" para obtener más posibilidades.
INSERT INTO YourTable (1, 2, etc.)
OUTPUT inserted.yourIDcolumn
VALUES (value1, value2, value...)
Nota: Esto es para MS SQL 2005 y superior.
insert into YourTable values (...)
obtener el nuevo PK con scope_identity ()
select scope_identity()