PDA

Ver la Versión Completa : insercion en multiples tablas


einarcito
30-08-2008, 01:56:22
hola:
como hago para insertar datos en multiples tablas?? ovbiamente relacionadas con una clave. como seria en este caso la sentencia , estoy usando sql server 2000...
me podrian escribir un ejemplito??? gracias

Caral
30-08-2008, 14:43:45
Hola
Aunque el tema ya se contesto aqui (http://www.clubdelphi.com/foros/showthread.php?p=310375#post310375), me parece que todavía no te queda claro.
Para hacer un insert en varias tablas es lo mismo que en una.
No importa si están relacionadas o no, esto solo afectara a la hora de relacionar la información, pero para mostrarla, no para insertarla o modificarla.
Ahora, para insertar lo que se necesita es:
1- Tener un query.
2- Hacer una sentencia sql.
3- Grabar la informacion.
El paso 3 se puede hacer, o bien directo, osea que se insertara pero no se veran los resultados en el form o viéndolos, me explico con este comando (ExecSQL) se hace directo y simplemente abriendo el query se hace visible.
Veamos que usa la sentencia sql:
las palabras Instert Into, seguido por el nombre de la tabla, entre paréntesis (Los campos que se quieren insertar de esa tabla) a continuacion la palabra Values y entre parentesis los (datos que quieres insertar).
Veamos un ejemplo:
El Query: Query1
La tabla: Tabla1
Los Campos: Id, Nombre, Apellido.
La Información: Edit1, Edit2, Edit3.
Ahora insertaremos en esa tabla:

Query1.SQL.Text := 'Insert Into Tabla1 (Id, Nombre, Apellido) '+
'Values (' +Edit1.Text+', '+Edit2.Text+', '+Edit3.Text')'
Query1.ExecSQL; // aqui la informacion se graba.
// Si quisieramos ver la informacion en algun dbgrid etc, abriríamos el query directamente, con (Query1.Open) en vez de (Query1.ExecSQL).

Ejemplo de dos o mas tablas:
El Query: Query1 (uno solo)
Las tablas: Tabla1, tabla2
Los Campos: tabla1(Id, Nombre, Apellido), tabla2(Id, telefono1,telefono2).
La Información: Edit1, Edit2, Edit3, Edit4, edit5.
Ahora insertaremos en las tablas:

// tabla1
Query1.SQL.Text := 'Insert Into Tabla1 (Id, Nombre, Apellido) '+
'Values (' +Edit1.Text+', '+Edit2.Text+', '+Edit3.Text')'
Query1.ExecSQL;
// tabla2
Query1.SQL.Text := 'Insert Into Tabla2 (Id, Telefono1, Telefono2) '+
'Values (' +Edit1.Text+', '+Edit4.Text+', '+Edit5.Text')'
Query1.ExecSQL;
// y asi sucesivamente.

Como ves el campo ID esta relacionado en las dos tablas y la información esta en el Edit1.
Espero que te quede mas claro y te sirva.
Saludos

Delphius
30-08-2008, 17:34:24
Solo una aclaración, que a mi modo de ver no estaría demás, si me lo permiten:

Cuando se trata de insertar en tablas relacionadas deben hacerse según el orden de dependencias:

1. Insertar en tabla maestro
2. Insertar en tabla esclava

Esto es así, pues lo exige la integridad referencial.

Y no olvidar que el valor a insertar y que forma de enlace entre ambas tablas debe ser el mismo. Es decir que si por ejemplo, en la tabla maestro se inserta un registro con ID igual a 1234, al insertar un registro "esclavo" correspondiente a dicho "maestro", ese mismo valor de ID debe ser ingresado en la clave foranea.

El compañero Caral muestra un ejemplo en el que hay dos campos ID. Uno de ellos es para la tabla1 y otro para la tabla2. Si tabla2 es la tabla dependiente ese ID debe ser la clave foránea y contar con su propia clave primaria (Normalmente hablar de ID hace alusión a la clave primaria).

Recuerden que para garantizar la referencia de una relación 1 a M se necesita de:
1. Un campo "ID" en tabla maestra que sea clave primaria.
2. Un campo "ID" en tabla esclava que sea clave primaria, para identificar a un registro esclavo de otro.
3. Un campo "FID" en tabla esclava que sea clave foranea. Este se unirá al ID de la tabla maestra para formar la relación.

Saludos,

einarcito
30-08-2008, 18:30:20
muchas gracias a caral y a delphiusss buenos consejos para realziar la practica ya lo he resuelto al problema, muchas graciassss ahora una ultima pregunta, me conviene q mi tabla 1 en el id(pk) sea de tipo auto incremente y la (fk) de la tabla 2 tmb?? porq si no lo definiera asi me daria error cunado quisiera ingresar un datos con el mismo id... TENKUUU

Delphius
30-08-2008, 19:05:10
muchas gracias a caral y a delphiusss buenos consejos para realziar la practica ya lo he resuelto al problema, muchas graciassss ahora una ultima pregunta, me conviene q mi tabla 1 en el id(pk) sea de tipo auto incremente y la (fk) de la tabla 2 tmb?? porq si no lo definiera asi me daria error cunado quisiera ingresar un datos con el mismo id... TENKUUU
Nunca en mi vida vi un FK que sea autoincremental. Razonandolo un poco... ¿como va a adivinar el motor a que registro maestro le pertenece? Si el campo FK de la tabla esclava es autoincremental tendrás un gran y divino lio de cocos: registros esclavos asociados a registros maestros posiblemente inexistentes.

Un ejemplo:
1. Ingresas un registro maestro: PK = 1.

Necesitas ingresar a dicho registro maestro tres esclavos. Veamos añadimos:
1. Agreamos el primer registro: PK = ?, FK = 1
2. Agregamos el segundo registro. OK = ? + ?, FK = 2 ¡Error! No se ha encontrado un registro correspondiente en la tabla maestra.

Un campo ID no necesariamente debe ser incremental. Por ello el signo de preguntas.

Como debes intuir, depende de otras cuestiones, necesidades y en ciertos casos por el gusto de cada uno.

Si empleas autoincrementales no debes agregar en la consulta dicho campo. El motor solito se encarga de asignarle valor.

Como dice el amigo Caral: No importa si están o no relacionadas. Si no estan relacionadas las tablas mediante PK y FK, el motor no protesta. Protesta en caso de que SI estén relacionadas y se rompa el principio de integridad referencial. ¿Está ahora más claro? Espero que si:o.

Saludos,

einarcito
30-08-2008, 19:23:52
mas claro que el aguaaaaaaaa!!!!! muchas gracias

Delphius
02-09-2008, 03:32:01
mas claro que el aguaaaaaaaa!!!!! muchas gracias
Disculpa, he estado fuera estos días.
No pude sentir un poco de preocupación por el tema... ¿Realmente se entendió lo que quise decir?:confused: No tengo problemas en explicar mejor el tema.

Saludos,