在MySQL

时间:2019-12-03 21:36:41

标签: mysql sql node.js database database-design

我有两个桌子

产品表

Products Table

CREATE TABLE `products` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(45) NOT NULL,
  `product_prices` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id_UNIQUE` (`id`),
  UNIQUE KEY `name_UNIQUE` (`name`),
  KEY `products_ibfk_1` (`sub_category_id`),
  CONSTRAINT `products_ibfk_1` FOREIGN KEY (`sub_category_id`) REFERENCES `sub_category` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=79 DEFAULT CHARSET=utf8

Products表包含唯一的 name 列。 此名称在价目表中用作 products_id 的FK。

价格表

price table

CREATE TABLE `price` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `price` varchar(255) NOT NULL,
  `products_id` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `price_ibfk_1` (`products_id`),
  CONSTRAINT `price_ibfk_1` FOREIGN KEY (`products_id`) REFERENCES `products` (`name`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8

我有一个发布请求来创建产品

router.post('/createproduct', (req, res) => {
    var name = req.body.name;
    var product_prices= req.body.product_prices;

    var query = `INSERT INTO products (name, product_prices) VALUES ("${name}", (SELECT price FROM price WHERE products_id = "${name}"))`;
    connection.query(query, (err, rows) => {
        if (!err) {
            res.send(rows);
        } else {
            throw err;
        }
    });
});

我要实现的是在创建产品时,如果名称存在的话,请更新 products 表(如果未插入 products 中)。

另一件事: 在创建产品时,应将 product_prices 中的值插入 price 表中,并获取具有匹配FK的 price 表中的所有价格。

products表中的 product_prices 是价格表中价格的数组。

我知道查询不正确,因为我还在测试中。

如果这听起来很模糊和复杂,请不要理会这个初学者。

如果有人可以帮助我进行查询或提供其他更好的解决方案,我将非常感谢。

注意:我正在使用mysql,node.js,express,react和redux进行此项目。

编辑:我正在尝试按@EM K建议的存储过程。 但是@uid始终为null,count始终为0。

CREATE DEFINER=`xyz` PROCEDURE `create_procedure`(IN name varchar(255), description varchar(255), sub_category_id varchar(255), categories varchar(255), sub_categories varchar(255), product_images varchar(255), product_prices varchar(255), created varchar(255))
BEGIN

SELECT @count := count(id) as count, @uid := id as prodid, @name := name as product_name , @product_prices := product_prices as v_product_prices
from products
where name = @name;

IF @count = 1 THEN
    update products SET product_prices = @product_prices where id = @uid;
    insert into price(price, product_id) select product_prices, id from products where id = @uid;
END IF;

IF @count = 0 THEN
    insert into products (name, description, sub_category_id, categories, sub_categories, product_images, product_prices, created) values (name, description, ((SELECT id FROM sub_category WHERE sub_category_name = sub_categories)), categories, sub_categories, product_images, product_prices, created);
    insert into price(price, product_id) select product_prices, id from products where id = @uid;
END IF;

END

谢谢。

1 个答案:

答案 0 :(得分:0)

请尝试编写存储过程,而不要调用直接查询。