【问题标题】:How to insert data in two tables with a single line of command in mysql?如何在mysql中用一行命令在两个表中插入数据?
【发布时间】:2022-01-04 10:45:41
【问题描述】:

首先,我看到了一些接近这个问题的答案,但它不起作用。这就是为什么我创建了一个新问题,这里是规范:

我创建了两个表:

CREATE TABLE car_info (
    id int PRIMARY KEY AUTO_INCREMENT NOT NULL, 
    mileage int, 
    make varchar(100), 
    model varchar(100), 
    fuel varchar(100), 
    gear varchar(100), 
    offertype varchar(100)
);

CREATE TABLE sales_info (
    id int PRIMARY KEY AUTO_INCREMENT NOT NULL, 
    FOREIGN KEY(id) REFERENCES car_info(id), 
    price int, 
    hp int, 
    year int
);

我加入了这两个:

select * 
from (SELECT * 
        FROM car_info
     ) as a 
    left outer join (SELECT * 
                    FROM sales_info
                    ) as b on a.id = b.id 
union 
select * 
from (SELECT * 
        FROM car_info
      ) as a 
    right outer join (SELECT * 
                    FROM sales_info
                    ) as b on a.id = b.id;

如您所见,id 是这里的常用变量。这里是 car_info 表:

+-----------+--------------+------+-----+---------+----------------+
| Field     | Type         | Null | Key | Default | Extra          |
+-----------+--------------+------+-----+---------+----------------+
| id        | int          | NO   | PRI | NULL    | auto_increment |
| mileage   | int          | YES  |     | NULL    |                |
| make      | varchar(100) | YES  |     | NULL    |                |
| model     | varchar(100) | YES  |     | NULL    |                |
| fuel      | varchar(100) | YES  |     | NULL    |                |
| gear      | varchar(100) | YES  |     | NULL    |                |
| offertype | varchar(100) | YES  |     | NULL    |                |
+-----------+--------------+------+-----+---------+----------------+

这里是 sales_info 表:

+-------+------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra          |
+-------+------+------+-----+---------+----------------+
| id    | int  | NO   | PRI | NULL    | auto_increment |
| price | int  | YES  |     | NULL    |                |
| hp    | int  | YES  |     | NULL    |                |
| year  | int  | YES  |     | NULL    |                |
+-------+------+------+-----+---------+----------------+

这里是我通常用来在单个表中导入 SQL 数据的代码:

app.post('/save', (req, res) => {
    let data = { mileage: req.body.mileage, make: req.body.make, model: req.body.model, fuel: req.body.fuel, gear: req.body.gear, offertype: req.body.offertype };
    let sql = "INSERT INTO car_info SET ?";
    let query = connection.query(sql, data, (err, result) => {
        if (err) throw err;
        res.redirect('/');
    });
});

当我使用此代码并从表单中调用它时,它可以完美运行。但是,我想做的是,我想从表单中调用此代码并将两个表导入到相关信息中,例如:

app.post('/save', (req, res) => {
    let data = { mileage: req.body.mileage, make: req.body.make, model: req.body.model, fuel: req.body.fuel, gear: req.body.gear, offertype: req.body.offertype, price: req.body.price, hp: req.body.hp, year: req.body.year };
    let sql = "**car_info and sales_info tables code here**";
    let query = connection.query(sql, data, (err, result) => {
        if (err) throw err;
        res.redirect('/');
    });
});

最后,我尝试了类似的方法:

let sql = `INSERT INTO car_info 
                    (mileage, make, model, fuel, gear, offertype) 
            VALUES('${req.body.mileage}', '${req.body.make}', 
                    '${req.body.model}', '${req.body.fuel}', 
                    '${req.body.gear}', '${req.body.offertype}');
           INSERT INTO sales_info
                    (price, hp, year) 
            VALUES('${req.body.price}', '${req.body.hp}', 
                    '${req.body.year}');`

但这里的问题是,它只在 car_info 中插入数据,而不在 sales_info 中插入数据,尽管我在相关字段中输入了一些值。

我希望问题很清楚,我该如何实现?

【问题讨论】:

  • Small Asidesales_info.id 作为自动增量和外键肯定是没有意义的???这在语法上是否有效????
  • 没错,主键是“salesid”,fk 是“carsid”。
  • 不需要右连接部分。 (它不会添加任何额外的行。)
  • 嗨@RiggsFolly 我是这个领域的新手,如果你有任何建议,我真的很高兴:)
  • 第 3 点在一个事务中进行 2 个单独的查询会更简单、更可靠。然后可以采取全有或全无的方法来创建这两行

标签: javascript mysql sql node.js web


【解决方案1】:

由于您的两个表有不同的列,我建议您在两个不同的变量中创建两个查询,然后将从req.body收集的数据相应地插入表中。

app.post('/save', (req, res) => {
    const { milage, make, model, fuel, gear, offertype, price, hp, year } = req.body //Destructured object
    const car_info_query = `INSERT into car_info VALUES (?,?,?,?,?,?)`
    const sales_info_query = `INSERT into sales_info VALUES (?, ?, ?)`
    
    let write_car_info = connection.query(car_info_query, [milage, make, model, fuel, gear, offertype] , (err, result) => {
        if (err) throw err;
    });
    let write_sales_info = connection.query(sales_info_query, [price, hp, year], (err, result) => {
        if (err) throw err
    })
    //Insert into as many tables as you want
    res.redirect('/');
});

【讨论】:

    【解决方案2】:

    按照@jkalandarov 的回答,我解决了这个问题。这里的主要问题是 id 是外键的 sales_info 的关系。不过最后还是解决了:)

    这是我的最终代码:

    app.post('/save', (req, res) => {
        let car_info_data = { mileage: req.body.mileage, make: req.body.make, model: req.body.model, fuel: req.body.fuel, gear: req.body.gear, offertype: req.body.offertype };
        let sales_info_data = { price: req.body.price, hp: req.body.hp, year: req.body.year };
    
        const car_info_query = 'INSERT into car_info SET ? ';
        const sales_info_query = 'INSERT into sales_info SET ?';
    
        let write_car_info = connection.query(car_info_query, car_info_data, (err, result) => {
            if (err) throw err;
        });
        let write_sales_info = connection.query(sales_info_query, sales_info_data, (err, result) => {
            if (err) throw err;
        })
        //Insert into as many tables as you want
        res.redirect('/');
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-07
      • 2011-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-07
      相关资源
      最近更新 更多