Tengo un escenario en el que necesito leer el contenido de un archivo de Excel. En el archivo de Excel hay una columna que indica si una fila es primaria o no. Otros serán filas secundarias de la fila principal. Necesito insertar primario en una tabla. Obtenga el último insertId y almacene las filas secundarias en otra tabla. Pero siempre recibo algún error relacionado con "cosas de clave externa secundaria". A continuación se muestra el enfoque que estoy siguiendo.
Leyendo los contenidos de Excel con el siguiente código.
let reader = require('xlsx'); module.exports.storeData = () =>{ const file = reader.readFile('./data/file.xlsx'); let data = [] const sheets = file.SheetNames // for(let i = 0; i < sheets.length; i++) // { const temp = reader.utils.sheet_to_json( file.Sheets[file.SheetNames[sheets.indexOf('sheet-name')]]) temp.forEach((res) => { data.push(res) }) // } this.pushToDB(data); }
A continuación se muestra cómo verifico si la fila es primaria y envío datos a 1 tabla y a la otra tabla. También estoy usando async. Pero no obtener last_insertId de forma asíncrona. Algunos datos de la tabla principal se insertan pero no los datos de la tabla secundaria
let last_insert_id = 0; const executeQuery = async (con, query, params) => { return new Promise((resolve, reject) => { con.query(query, params, (err, result) => { if (err) { return reject(err); } return resolve(result); }); }); } module.exports.pushToDB = async (data) => { var mysql = require('mysql'); var con = mysql.createConnection({ host: "localhost", user: "root", password: "", database: "data-db" }); con.connect(async function(err) { if (err) throw err; console.log("Connected!"); data.forEach(async (res, ind) => { try { if(res['Primary_Col'] == 'Yes'){ let param = ['col1'] const query1 = "INSERT INTO Main_Table (COL1) VALUES (?)"; const result = await executeQuery(con, query1, param); last_insert_id = result.insertId; console.log(last_insert_id); } if(res['Primary_Col'] == 'No'){ let param = ['col1', 'col2', 'col3' ] const query1 = "INSERT INTO SUB_TABLE (COL1, COL2, COL3) VALUES (?,?,?)"; const result = await executeQuery(con, query1, param.map(String)); //param array values will be changes to string } } catch (err) { con.destroy; throw err; } }); }); } this.storeData();
el error exacto
Error: ER_NO_REFERENCED_ROW_2: Cannot add or update a child row: a foreign key constraint fails