SQL - insertar registros

 
Vista:

insertar registros

Publicado por Maki (2 intervenciones) el 15/01/2012 14:23:24
Hola.

Estoy aprendiendo en el tema de base de datos relacionales con SQL CE y me gustaría hacerles una pregunta.

He creado una estructura de tablas relacionadas y he creado las (Primary y foreign key), todavía no he ingresado datos.

Cuando me dispongo a introducir datos, abro la tabla con el IDE de visual Studio y empiezo a rellenar los campos pero cuando llego a el campo ID de la tabla relacionada que es la FK y autonumérica, ¿como puedo saber cual tengo que poner sin tener que mirar la otra tabla?



Un saludo
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
Imágen de perfil de xve
Val: 135
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

insertar registros

Publicado por xve (284 intervenciones) el 15/01/2012 16:52:20
Hola Maki, no se muy bien como lo haces, pero creo que tienes que poner null, y el automáticamente busca el siguiente valor autonómico.

Coméntanos, ok?
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

insertar registros

Publicado por Maki (2 intervenciones) el 17/01/2012 18:56:49
Gracias por la respuesta

Aqui esta la solución


En vez de ingresar los datos de forma manual, usa sentencias INSERT, para que al insertar en la tabla que esta en el lado padre de la relacion, puedas usar la funcion SCOPE_IDENTITY() para agarrar el valor asignado a la columna autonumerica. Esto debes hacerlo bajo una transaccion para que si algo falla, que toda sea revertido y la base queda en un estado estable y correcto.

Supongamos que tenemos dos tablas relacionados 1-M, T1 es el padre (autonumerico) y T2 es hijo, entonces podemos usar algo asi como:

declare @an_padre int;

set nocount on;
set xact_abort on;

begin try
begin transaction;

insert into T1(c1, ..., cn)
values (...);

set @an_padre = SCOPE_IDENTITY();

insert into T2(an_padre, c1, ..., cn)
values(@an_padre, ...);

commit transaction;

return 0;
end try
begin catch
if @@trancount > 0 rollback transaction;

select error_number() as error_number, error_message() as error_msg;

return -1;
end catch;

Esta operacion podras hacerla cuando solo insertamos un padre a la vez, para poder agarrar el valor SCOPE_IDENTITY despues de la inserccion, y proceder a ingresar los hijos de ese padre. Como podras notar, para usar este metodo con muchos padres, tendremos que hacer un lazo y recorrer los padres para ingresarlos uno a uno, con sus hijos.

Recuerda que toda tabla debe tener una clave natural, y que las columnas autonumericas se usan con frecuencia como claves surrogadas. Si tenemos una clave natural, podriamos relacionar los hijos con la tabla padres, por la clave natural, y poder halar los valores autonumericos ingresados, o incluso usar la clausula OUTPUT de la sentencia INSERT para tomar esos valores ingresados y unirlos con los hijos mediante la clave natural y poder insertar en los hijos los valores autonumericos de los padres.

Ejemplo: (no inclui manejo de errores, ni control de transaccion)

SET NOCOUNT ON;
USE tempdb;
GO
CREATE TABLE dbo.T1 (
c1 int NOT NULL IDENTITY CONSTRAINT PK_T1 PRIMARY KEY CLUSTERED,
c2 CHAR(5) NOT NULL UNIQUE
);
GO
CREATE TABLE dbo.T2 (
c1 int NOT NULL CONSTRAINT FK_T2_T1 FOREIGN KEY REFERENCES dbo.T1(c1),
c2 int NOT NULL IDENTITY,
c3 varchar(25) NOT NULL,
CONSTRAINT PK_T2 PRIMARY KEY (c1, c2)
);
GO
DECLARE @T TABLE (c1 int NOT NULL PRIMARY KEY, c2 CHAR(5) UNIQUE);

INSERT INTO
dbo.T1 (c2)
OUTPUT
INSERTED.c1, INSERTED.c2 INTO @T(c1, c2)
VALUES
('AAAAA'), ('BBBBB'), ('CCCCC');

INSERT INTO dbo.T2 (c1, c3)
SELECT
B.c1,
A.c2
FROM
(
VALUES
('AAAAA', 'uno'),
('BBBBB', 'dos'),
('BBBBB', 'tres'),
('CCCCC', 'cuatro')
) AS A(c1, c2)
INNER JOIN
@T AS B
ON A.c1 = B.c2;

SELECT * FROM dbo.T1;
SELECT * FROM dbo.T2;
SELECT * FROM @T;
GO
DROP TABLE dbo.T2, dbo.T1;
GO
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