如何将一些表信息插入另一个表列?

时间:2019-08-21 11:38:04

标签: mysql node.js

我是mySQL的初学者,我正在尝试使用有关用户的信息创建用户表(请参见代码),并在列中填充我从创建的新表中获得的详细信息。

现在,我希望能够将“信用卡”表中的一些信息(例如数字)放到包含“信用卡”列的“用户”表中,以便我可以看到每个用户的信用卡号。 / p>

我还将用户名与信用卡所有者的名字进行比较,以便它根据用户填充表格。

我在这里找不到有关特定问题的任何信息。 这是我要写的方法:

con.query(createNewCreditCard, [name, type, number, expiration, svss], (err, results) => {
        if (err) {
          console.error(err);
        } else {
          const JoinCreditCard = 'INSERT INTO users (creditcard) SELECT number,name FROM creditcards WHERE users.name = creditcards.name';

const userCreateModel = `
  CREATE TABLE IF NOT EXISTS users (
    id INT(11) NOT NULL AUTO_INCREMENT,
    name VARCHAR(45) NOT NULL,
    username VARCHAR(45) NOT NULL,
    email VARCHAR(45) NOT NULL,
    phonenumber VARCHAR(45) NOT NULL,
    password VARCHAR(255) NOT NULL,
    creditcard INT(11),
    salt VARCHAR(255),
    created_at DATE,
    update_at DATE,
    deleted_at DATE,
    lastSignIn DATE,
    PRIMARY key (id)
  )
`;

const CreditCardModel = `
  CREATE TABLE IF NOT EXISTS creditcards (
      id INT(11) NOT NULL AUTO_INCREMENT,
      name VARCHAR (25) NOT NULL,
      type VARCHAR(10) NOT NULL,
      number INT(12) NOT NULL,
      expiration DATE,
      svss INT(3) NOT NULL,
      created_at DATE,
      PRIMARY key (id)
  )
`;

我正在尝试创建一个名为ula的用户,然后创建一个我从邮递员发送的,名为ula(以及所有其他列)的信用卡。 nodejs中的信用卡部分如下所示:

const createCreditCard = async (req, res, next) => {
    const {
      name,
      type, 
      number, 
      expiration,
      svss
    }: {
      name: String,
      type: String,
      number: String,
      expiration: String,
      svss: String
    } = req.body;

    const createAt = new Date(Date.now());

    try {
      const createNewCreditCard = 'INSERT INTO creditcards (name, type, number, expiration, svss) VALUES (?,?,?,?,?)';
      con.query(createNewCreditCard, [name, type, number, expiration, svss], (err, results) => {
        if (err) {
          console.error(err);
        } else {
          const JoinCreditCard = 'UPDATE users SET creditcard=' + number + ' WHERE name="' +  name + '"';
          console.log(results);              
        }
      });

      res.status(201).send({ success: true, message: 'New credit card was created', data: {name, type, number, expiration, svss} });
    } catch (error) {
      res.status(500).send({ success: false, message: 'Server error' });
    }

    await next;
  }

服务器返回201,我转到mysql,打开用户,请参阅creditcard列及其NULL

2 个答案:

答案 0 :(得分:0)

重要的是,表格必须采用规范化形式。 应该有3张桌子。 用户-所有用户数据 信用卡-所有与信用卡有关的信息。 用户信用卡地图-将用户映射到信用卡信息。

答案 1 :(得分:0)

由于users表的数据库中已经存在该条目,因此应使用UPDATE而不是INSERT

一个适用于您的代码的示例(您已经将namenumber称为var,因为您刚刚使用它们创建了信用卡信息,而无需再次选择它们):

con.query(createNewCreditCard, [name, type, number, expiration, svss], (err, results) => {
        if (err) {
          console.error(err);
        } else {
          const JoinCreditCard = 'UPDATE users SET creditcard=' + number + ' WHERE name="' +  name + '"';

编辑:这是您所做修改的新代码。您已经使用了准备好的语句,所以请忘记我的通知。我已更新查询以遵循此要求。您的代码中缺少的是您实际上需要执行查询!只声明常量不会对数据库有任何作用。

    try {
      const createNewCreditCard = 'INSERT INTO creditcards (name, type, number, expiration, svss) VALUES (?,?,?,?,?)';
      con.query(createNewCreditCard, [name, type, number, expiration, svss], (err, results) => {
        if (err) {
          console.error(err);
        } else {
          console.log(results);
          const JoinCreditCard = 'UPDATE users SET creditcard=? WHERE name=?';
          con.query(JoinCreditCard, [number, name], (err, results) => {
            if (err) {
              console.error(err);
            } else {
              console.log(results);
            }
          });
        }
      });

      res.status(201).send({ success: true, message: 'New credit card was created', data: {name, type, number, expiration, svss} });
    } catch (error) {
      res.status(500).send({ success: false, message: 'Server error' });
    }

注意:您应该知道,使用名称来引用信用卡将不会允许您为一个用户使用多张信用卡,并且应注意使用相同名称的用户,否则此查询将更新两个用户。始终使用id子句中的用户WHERE字段会更安全。 (您现在应该知道)

这是我的建议:

  • 通常最好让users中的信用卡只存储信用卡表中的ID。这样,关系就位于主键上,并且关系得到了优化(您需要在信用卡创建请求后在下面的代码的内部SELECT中获得ID)。
  • 使用ID标识行更新,以防止2位用户被更新

  • 从信用卡表中删除name,它已经在用户中

  • 具有第三个表来引用诸如user1974729之类的关系不是强制性的,但是,如果您方便地希望每个用户拥有多于一张信用卡或多于一个用户,则情况会如此共享卡(1对n的关系)

代码:

//relation based on id instead of number stored in users + name removed. I assume at this point, you know the id of your user (in var "id" used below in `WHERE` clause)
con.query(createNewCreditCard, [type, number, expiration, svss], (err, results) => {
        if (err) {
          console.error(err);
        } else {
          const JoinCreditCard = 'UPDATE users SET creditcard=(SELECT id FROM creditcards WHERE type="' + type + '" AND number="' + number + '" AND expiration="' + expiration + '" AND svss="' + svss + '") WHERE id="' + id + '"';

//no change in userCreateModel

//deleted "name" in CreditCardModel
const CreditCardModel = `
  CREATE TABLE IF NOT EXISTS creditcards (
      id INT(11) NOT NULL AUTO_INCREMENT,
      type VARCHAR(10) NOT NULL,
      number INT(12) NOT NULL,
      expiration DATE,
      svss INT(3) NOT NULL,
      created_at DATE,
      PRIMARY key (id)
  )
`;