错误 1452 MySQL 和 NodeJS。为啥数据库不能正确引用我的表?

Posted

技术标签:

【中文标题】错误 1452 MySQL 和 NodeJS。为啥数据库不能正确引用我的表?【英文标题】:Error 1452 MySQL and NodeJS. How come the database cant reference my table right?错误 1452 MySQL 和 NodeJS。为什么数据库不能正确引用我的表? 【发布时间】:2018-12-19 23:32:09 【问题描述】:

所以我在插入新用户帐户时从我的节点控制台收到错误 1452。 这是错误

错误:ER_NO_REFERENCED_ROW_2:无法添加或更新子行:外键约束失败 (myeherlpertst2.customers, CONSTRAINT customers_ibfk_1 FOREIGN KEY (user_id) REFERENCES users (user_id) )

代码:'ER_NO_REFERENCED_ROW_2', 错误号:1452, sqlMessage: '无法添加或更新子行:外键约束失败 (myeherlpertst2.customers, CONSTRAINT customers_ibfk_1 FOREIGN KEY (user_id) REFERENCES users (user_id))', sqlState: '23000', 索引:0,

我很确定我收到此错误的原因是因为客户表试图引用不存在的东西但我不明白为什么它不引用它。在下面的节点代码中,我首先插入用户表,该表自动增加 user_id 并且不为空。我是否必须为第一次插入结束事务,然后开始一个新事务,然后才能插入到客户表中?

    connection.beginTransaction(function(error)

    if(error)

    console.log('Error Caught');
    return res;


  if (error) throw error;
    console.log('Error Caught');
    return;
  connection.query('Insert into users( user_name, user_password, user_type) values (?,?,?)', [customer.body.userName, customer.body.password, userType=1], function (error, results, fields) 
    if (error) 
      console.log(error);
      return;
    
      connection.query('Insert into customers(cust_first_name, cust_last_name, cust_email, cust_city, cust_address, cust_zip_code, cust_state, cust_phone_num, cust_role, cust_website, cust_business_name) values (?,?,?,?,?,?,?,?,?,?,?)', [customer.body.firstName, customer.body.lastName, customer.body.email, customer.body.city, customer.body.address, customer.body.zipCode, customer.body.state, customer.body.phoneNumber, customer.body.custRole=1, customer.body.website, customer.body.businessName], function (error, results, fields) 
      if (error) 
        console.log(error);
      
      );
    res.end(JSON.stringify(results));
    );
    console.log('End Transaction')
  );

【问题讨论】:

【参考方案1】:

您需要在customers 表中正确设置user_id 列。 mysql's LAST_INSERT_ID() function 是您需要的价值的来源。这是在 SQL 中执行此操作的方法。

Insert into users( user_name, user_password, user_type) values (?,?,?);

Insert into customers(user_id, cust_first_name, cust_last_name, cust_email, 
                      cust_city, cust_address, cust_zip_code, cust_state,
                      cust_phone_num, cust_role, cust_website, cust_business_name) 
              values (LAST_INSERT_ID(),?,?,?,?,?,?,?,?,?,?,?);

请注意,插入到客户表中的操作会将 LAST_INSERT_ID() 的值更改为该表中自动递增 ID 的值。因此,如果您需要重用 users 表中的值,请使用三个查询而不是两个查询:

Insert into users( user_name, user_password, user_type) values (?,?,?);

SET @userid := LAST_INSERT_ID();

Insert into customers(user_id, cust_first_name, cust_last_name, cust_email, 
                      cust_city, cust_address, cust_zip_code, cust_state,
                      cust_phone_num, cust_role, cust_website, cust_business_name) 
              values (@userid,?,?,?,?,?,?,?,?,?,?,?);

我会让你把查询放到你的节点程序中。

【讨论】:

但我认为客户表中的外键应该只是链接它。我认为问题是因为数据尚未写入数据库(无论出于何种原因),第二条语句存在外键问题。我会试试这个,但它似乎比正确地做更多的解决方法还是我错了?跨度> DBMS 强制执行 FK 约束。因此,这不是解决方法;这是使用外键编程数据库的核心部分。【参考方案2】:

无需其他查询:插入的结果包含最后一个自增插入 id

此信息可通过 results.insertId 获得。

所以更正就像:

connection.query(
      "Insert into users( user_name, user_password, user_type) values (?,?,?)",
      [customer.body.userName, customer.body.password, (userType = 1)],
      function(error, results, fields) 
        if (error) 
          console.log(error);
          return;
        
        connection.query(
          "Insert into customers(user_id, cust_first_name, cust_last_name, cust_email, cust_city, cust_address, cust_zip_code, cust_state, cust_phone_num, cust_role, cust_website, cust_business_name) values (?,?,?,?,?,?,?,?,?,?,?,?)",
          [
            results.insertId,
            customer.body.firstName,
            customer.body.lastName,
            customer.body.email,
            customer.body.city,
            customer.body.address,
            customer.body.zipCode,
            customer.body.state,
            customer.body.phoneNumber,
            (customer.body.custRole = 1),
            customer.body.website,
            customer.body.businessName
          ],
          function(error, results, fields) 
            if (error) 
              console.log(error);
            
          
        );
        res.end(JSON.stringify(results));
      
    );

顺便说一句:参数 userType=1 可能是一个错误

【讨论】:

O. Jones 和你的都有效。至于userType=1。我没有设计数据库的这一部分,也不知道它的用途。没有留下任何笔记。 使用 HeidiSQL 之类的 MySQL 客户端查看您继承的数据库。给出命令SHOW CREATE TABLE users;SHOW CREATE TABLE customers;。您将看到表的定义。

以上是关于错误 1452 MySQL 和 NodeJS。为啥数据库不能正确引用我的表?的主要内容,如果未能解决你的问题,请参考以下文章

mysql1452错误

Mysql 错误 #1452 - 无法添加或更新子行

MySQL 错误 1452 - 无法插入数据

在 MySQL 中出现 ERROR 1701、ERROR 1452 和 ERROR 1305 错误 - 需要一些专业知识

MySQL 中的外键约束错误 1452 - Magento 导入

MySQL 外键约束 - 错误 1452 - 无法添加或更新子行