únicamente, las tablas son cliente, prodcuto y nota, nota es la tabla donde tiene las llaves foraneas y se relaciona con las dos tablas anteriores
(cliente y producto).
Este diseño de base de datos lo tengo en tres gestores diferentes, los cuales son SQL Server, PostgreSQL y Mysql Workbench.
El código de las tablas para SQL Server es el siguiente:
Código:
Para el auto increment en las tablas tube que usar la función IDENTITY, ya que AUTO_INCREMENT como en Mysql no funciona en SQL Server ni en CREATE DATABASE tienda; USE tienda; CREATE TABLE producto( clave_producto INT IDENTITY(1,1), nombre_del_producto VARCHAR(20), precio FLOAT, CONSTRAINT pk_clave_producto PRIMARY KEY(clave_producto) ); CREATE TABLE cliente( clave_cliente INT IDENTITY(1,1), nombre_cliente VARCHAR(20), CONSTRAINT pk_clave_cliente PRIMARY KEY(clave_cliente) ); CREATE TABLE nota( folio INT IDENTITY(1,1), cantidad INT, subtotal FLOAT, clave_producto_1 INT, clave_cliente_1 INT, CONSTRAINT pk_folio PRIMARY KEY(folio), CONSTRAINT fk_clave_producto_1 FOREIGN KEY(clave_producto_1) REFERENCES producto(clave_producto), CONSTRAINT fk_clave_cliente_1 FOREIGN KEY(clave_cliente_1) REFERENCES cliente(clave_cliente) );
PostgreSQL.
Este es el código para PostgreSQL
Código:
NOTA: Lo pareceido a auto_increment en este gestor es "SERIAL"CREATE TABLE producto( clave_producto SERIAL, nombre_del_producto VARCHAR(20), precio FLOAT, CONSTRAINT pk_clave_producto PRIMARY KEY(clave_producto) ); CREATE TABLE cliente( clave_cliente SERIAL, nombre_cliente VARCHAR(20), CONSTRAINT pk_clave_cliente PRIMARY KEY(clave_cliente) ); CREATE TABLE nota( folio SERIAL, cantidad INT, subtotal FLOAT, clave_producto_1 INT, clave_cliente_1 INT, CONSTRAINT pk_folio PRIMARY KEY(folio), CONSTRAINT fk_clave_producto_1 FOREIGN KEY(clave_producto_1) REFERENCES producto(clave_producto), CONSTRAINT fk_clave_cliente_1 FOREIGN KEY(clave_cliente_1) REFERENCES cliente(clave_cliente) );
Para MySQL es el siguiente código
Código:
La estructura de esta pequeña base de datos queda de la siguiente forma:CREATE DATABASE tienda; USE tienda; CREATE TABLE producto( clave_producto INT AUTO_INCREMENT, nombre_del_producto VARCHAR(20), precio FLOAT, CONSTRAINT pk_clave_producto PRIMARY KEY(clave_producto) ); CREATE TABLE cliente( clave_cliente INT AUTO_INCREMENT, nombre_cliente VARCHAR(20), CONSTRAINT pk_clave_cliente PRIMARY KEY(clave_cliente) ); CREATE TABLE nota( folio INT AUTO_INCREMENT, cantidad INT, subtotal FLOAT, clave_producto_1 INT, clave_cliente_1 INT, CONSTRAINT pk_folio PRIMARY KEY(folio), CONSTRAINT fk_clave_producto_1 FOREIGN KEY(clave_producto_1) REFERENCES producto(clave_producto), CONSTRAINT fk_clave_cliente_1 FOREIGN KEY(clave_cliente_1) REFERENCES cliente(clave_cliente) );
Despues de tener la estructura de las tablas, se insertan los siguientes registros para las tablas cliente, producto y nota.
Código:
Hasta este punto podemos realizar las correspondientes consultas para visualizar los registros que se agregaron a cada una de las tablasINSERT INTO producto(nombre_del_producto,precio) VALUES('Refresco',15.20); INSERT INTO producto(nombre_del_producto,precio) VALUES('Papas',9.50); INSERT INTO producto(nombre_del_producto,precio) VALUES('Cacahuates',13.14); INSERT INTO producto(nombre_del_producto,precio) VALUES('Pastillas',24); INSERT INTO producto(nombre_del_producto,precio) VALUES('Chicles',12.50); INSERT INTO producto(nombre_del_producto,precio) VALUES('Pan',18.90); INSERT INTO producto(nombre_del_producto,precio) VALUES('Churritos',33.22); INSERT INTO producto(nombre_del_producto,precio) VALUES('Cerveza',21.50); INSERT INTO producto(nombre_del_producto,precio) VALUES('Huevo',32); INSERT INTO producto(nombre_del_producto,precio) VALUES('Jamon',48); INSERT INTO producto(nombre_del_producto,precio) VALUES('Maruchan',13); INSERT INTO producto(nombre_del_producto,precio) VALUES('Rastrillo',33.20); INSERT INTO producto(nombre_del_producto,precio) VALUES('Condon',70); INSERT INTO producto(nombre_del_producto,precio) VALUES('Tuaya',55.20); INSERT INTO producto(nombre_del_producto,precio) VALUES('Cotonetes',24.90); INSERT INTO producto(nombre_del_producto,precio) VALUES('Pasta',32.40); INSERT INTO producto(nombre_del_producto,precio) VALUES('Helado',16.40); INSERT INTO producto(nombre_del_producto,precio) VALUES('Suplemento',120.90); INSERT INTO producto(nombre_del_producto,precio) VALUES('Enjuague',40); INSERT INTO producto(nombre_del_producto,precio) VALUES('Hilo',18.50); INSERT INTO cliente(nombre_cliente) VALUES('Ariana Delgado'); INSERT INTO cliente(nombre_cliente) VALUES('Maricela Aguilar'); INSERT INTO cliente(nombre_cliente) VALUES('Edagr Corona'); INSERT INTO cliente(nombre_cliente) VALUES('Doribel Penagos'); INSERT INTO cliente(nombre_cliente) VALUES('Berenice Guerrero'); INSERT INTO nota(cantidad,subtotal,clave_producto_1,clave_cliente_1) VALUES(8,NULL,3,4); INSERT INTO nota(cantidad,subtotal,clave_producto_1,clave_cliente_1) VALUES(12,NULL,12,2); INSERT INTO nota(cantidad,subtotal,clave_producto_1,clave_cliente_1) VALUES(18,NULL,17,1); INSERT INTO nota(cantidad,subtotal,clave_producto_1,clave_cliente_1) VALUES(33,NULL,9,3); INSERT INTO nota(cantidad,subtotal,clave_producto_1,clave_cliente_1) VALUES(12,NULL,14,1); INSERT INTO nota(cantidad,subtotal,clave_producto_1,clave_cliente_1) VALUES(22,NULL,8,5); INSERT INTO nota(cantidad,subtotal,clave_producto_1,clave_cliente_1) VALUES(11,NULL,16,2); INSERT INTO nota(cantidad,subtotal,clave_producto_1,clave_cliente_1) VALUES(17,NULL,18,3); INSERT INTO nota(cantidad,subtotal,clave_producto_1,clave_cliente_1) VALUES(21,NULL,19,5); INSERT INTO nota(cantidad,subtotal,clave_producto_1,clave_cliente_1) VALUES(25,NULL,15,2);
Código:
En la tabla nota existe un campo llamado subtotal, el cual hasta el momento no tiene valor alguno almacenado, para obtener el resultado de este campo SELECT * FROM cliente; SELECT * FROM producto; SELECT * FROM nota;
en particular se requiere el uso de información de dos campos los cuales son: "cantidad y precio" los cuales se encuentran en tablas diferentes, para
llegar a la solución de este problema se recurrio a los UPDATE e Inner join, ya que nos pide que se actualice el campo subtotal de la tabla nota
usando la información de otra tabla, lo cual nos obliga a usar un join para poder hacer este puenteo de información entre tablas, la consulta que
realice fue la siguiente:
Código:
Consultamos los nuevos registros actualizados: SELEC * FROM nota y vemos en SQL Server que es un éxito la operación:UPDATE nota SET subtotal = cantidad * precio FROM nota INNER JOIN producto ON producto.clave_producto = nota.clave_producto_1;
La cual me funciono de maravilla pero únicamente para SQL Server, para PostgreSQL y MySQL no funciona, use el mismo script para estos gestores y los
mensajes de error que me envia son los siguientes:
ERROR MySQL
ERROR PostgreSQL
Es aqui donde surgen los problemas, ya que este UPDATE que use para SQL Server no funciona en estos dos gestores, así que intente lo siguiente para
ver si podia multiplicar los campos de otra manera y agregarlos al compo correspondiente llamado subtotal de la tabla nota, con el siguiente scirpt:
Código:
Con esta consulta me muestra datos (La únion de los campos que se logra con los JOINS) pero en el campo subtotal no me mestra resultado alguno, los SELECT nombre_cliente,nombre_del_producto,subtotal=cantidad*precio FROM ( SELECT nombre_cliente, nombre_del_producto, cantidad, precio, subtotal FROM cliente INNER JOIN nota ON nota.clave_cliente_1 = cliente.clave_cliente INNER JOIN producto ON producto.clave_producto = nota.clave_producto_1 )AS sub;
registros de ese campo en particular se muestran vacios.
MySQL
PostgreSQL
Deseo saber cual o cuales son las maneras correctas para poder multiplicar campos de diferentes tablas usando UPDATE y los Joins, intente varias
combinaciones con subconsultas, pero ningúna me ofrece el resultado que requiero.
Espero puedan ayudarme indicandome que debo investigar para poder solucionar este problema, de antemano gracias por leer mi mensaje.