是否可以同时创建多个表的行?

问题描述 投票:0回答:1

我是一名学习编码的学生,所以不要期望代码的质量很好。我正在为我的学校项目制作一个游戏,我在 VS Code 中使用 javascript、node js 和 mysql2。我只使用postman来获取json格式的结果,因为我还没有学会实现前端。

邮递员将用作“post - http://localhost:3000/inventory/userId”,其中 userId 是用户想要放入的内容,它将创建一个玩家,同时还将创建库存,装备和未装备的行。新创建的行应在 invenoty 和player 列中使用。如果你看看我的图片或表格,我想你可能会明白我想说的。 Diagram of my tables, or at least the idea of it

我想我可能需要使用中间件功能,但我仍然不太确定。

我还没有真正为我的控制器文件编写任何内容,因为我首先想确保我有代码来创建包含项目的行。以下是我迄今为止编写的代码。

inventoryRoute.js

const express = require('express');
const router = express.Router();

const controller = require('../controllers/inventoryController');

router.post('/:userId', controller.createPlayer); // Create player with inventory

module.exports = router;

inventoryModel.js

module.exports.insertSingle = (data, callback) => {
    const SQL_STATEMENT = `
    INSERT INTO Inventory (equipped_id, unequipped_id)
    INSERT INTO Equipped (inventory_id, weapon_id, armor_id, artifact_id)
    INSERT INTO Unequipped (inventory_id, weapon_id, armor_id, artifact_id)
    INSERT INTO Player (user_id, inventory_id)
    VALUES (?, ?);
    SELECT * FROM Player
    WHERE id = LAST_INSERT_ID(); 
    `;
    const VALUES = [data.user_id, data.inventory_id];

    pool.query(SQL_STATEMENT, VALUES, callback);
}

表.js

CREATE TABLE User (
    user_id INT PRIMARY KEY AUTO_INCREMENT,
    username TEXT,
    email TEXT
);

CREATE TABLE Player (
    player_id INT PRIMARY KEY AUTO_INCREMENT,
    user_id INT NOT NULL,
    inventory_id INT NOT NULL,
    hp INT DEFAULT 3,
    atk INT DEFAULT 1,
    def INT DEFAULT 1
);

CREATE TABLE Inventory (
    inventory_id INT PRIMARY KEY AUTO_INCREMENT,
    equipped_id INT NOT NULL,
    unequipped_id INT NOT NULL
);

CREATE TABLE Equipped (
    equipped_id INT PRIMARY KEY AUTO_INCREMENT,
    inventory_id INT,
    weapon_id INT,
    armor_id INT,
    artifact_id INT
);

CREATE TABLE Unequipped (
    unequipped_id INT PRIMARY KEY AUTO_INCREMENT,
    inventory_id INT,
    weapon_id INT,
    armor_id INT,
    artifact_id INT
);

CREATE TABLE Weapon (
    weapon_id INT PRIMARY KEY AUTO_INCREMENT,
    unequipped_id INT,
    merchant_id INT NOT NULL,
    name TEXT NOT NULL,
    description TEXT,
    atk INT,
    points INT
);

INSERT INTO Weapon (unequipped_id, merchant_id, name, description, atk, points) VALUES
(NULL, 1, 'Dull Sword', 'A sword that has not been sharpened in a while', 3, 1);

CREATE TABLE Armor (
    armor_id INT PRIMARY KEY AUTO_INCREMENT,
    unequipped_id INT,
    merchant_id INT NOT NULL,
    name TEXT NOT NULL,
    description TEXT,
    def INT,
    points INT
);

INSERT INTO Armor (unequipped_id, merchant_id, name, description, def, points) VALUES
(NULL, 1, 'Worned Out Armor', 'An armor that has worn out due to long usage and no maintenance', 3, 1);

CREATE TABLE Artifact (
    artifact_id INT PRIMARY KEY AUTO_INCREMENT,
    unequipped_id INT,
    merchant_id INT NOT NULL,
    name TEXT NOT NULL,
    description TEXT,
    hp INT,
    points INT
);

INSERT INTO Artifact (unequipped_id, merchant_id, name, description, hp, points) VALUES
(NULL, 1, 'Health Boost Necklace', 'A necklace that increases health slightly', 2, 1);

CREATE TABLE Merchant (
    merchant_id INT PRIMARY KEY AUTO_INCREMENT,
    name TEXT NOT NULL,
    weapon_id INT NOT NULL,
    armor_id INT NOT NULL,
    artifact_id INT NOT NULL
);

INSERT INTO Merchant (name, weapon_id, armor_id, artifact_id) VALUES
('John', 1, 1, 1);
javascript node.js mysql2
1个回答
0
投票

您提供的代码似乎是尝试使用 Node.js 和 MySQL 数据库执行多个 SQL

INSERT
操作,然后执行
SELECT
语句。但是,SQL 语法不正确。如果不使用
INSERT
,则单个查询中不能有多个
transactions
语句。

这是使用事务的代码的更正版本:

module.exports.insertSingle = (data, callback) => {
   const SQL_STATEMENT = `
       START TRANSACTION;
   
       INSERT INTO Inventory (equipped_id, unequipped_id) VALUES (?, ?);
       SET @inventory_id = LAST_INSERT_ID();
   
       INSERT INTO Equipped (inventory_id, weapon_id, armor_id, artifact_id) VALUES (@inventory_id, ?, ?, ?);
       INSERT INTO Unequipped (inventory_id, weapon_id, armor_id, artifact_id) VALUES (@inventory_id, ?, ?, ?);
   
       INSERT INTO Player (user_id, inventory_id) VALUES (?, @inventory_id);
       
       COMMIT;
   
       SELECT * FROM Player WHERE id = LAST_INSERT_ID(); 
       `;
       
       const VALUES = [
           data.equipped_id,
           data.unequipped_id,
           data.weapon_id_equipped,
           data.armor_id_equipped,
           data.artifact_id_equipped,
           data.weapon_id_unequipped,
           data.armor_id_unequipped,
           data.artifact_id_unequipped,
           data.user_id,
       ];
   
       pool.query(SQL_STATEMENT, VALUES, callback);
   }

有几点需要注意:

  1. 我添加了
    START TRANSACTION
    COMMIT
    语句,将
    INSERT
    操作分组到一个事务中。这确保要么执行所有
    INSERT
    语句,要么都不执行。
  2. 我使用
    SET @variable_name = value
    语法将最后插入的
    ID
    存储到变量中(在本例中为 @inventory_id),以便在后续
    INSERT
    语句中使用它。
  3. 我为
    VALUES
    数组中的缺失值添加了占位符。您可能需要根据您的数据结构调整它们。

请根据您的具体数据库架构和要求调整代码。

© www.soinside.com 2019 - 2024. All rights reserved.