有没有办法在mysql中设置一列将自动成为该行的行号值?

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

我对创建自己的项目和 SQL 非常陌生,并且我在使用“排名”列时遇到问题,该列将根据“时间”列生成特定数据行的排名。我正在制作一个全栈 CRUD 数据库,它从 mysql 数据库提取到快速前端,到目前为止,我似乎无法弄清楚如何执行返回 name = ? 的行的“搜索”函数。使用 ROW_NUMBER 函数时来自用户输入。我仍然认为,与每次想要查找搜索结果时运行 ROW_NUMBER 查询相比,拥有一个完全独立的列是理想的选择,但我不知道如何做到这一点。

到目前为止我的搜索功能如下:

async searchByName(name) {
        try{
            const response = await new Promise((resolve, reject) => {
                const query = "SELECT *, ROW_NUMBER() OVER (ORDER BY time) rn FROM medley_relay; SELECT * FROM medley_relay WHERE name = ?;";

                connection.query(query, [name], (err, results) => {
                    if (err) reject(new Error(err.message));
                    resolve(results);
                })
            });
            console.log(response);
            return response;
        } catch (error) {
            console.log(error);
        }
    }

它的名字是这样的:

    const {name} = request.params;
    const db = dbService.getDbServiceInstance();

    const result = db.searchByName(name);

    

    result
    .then(data => response.json({data : data}))
    .catch(err => console.log(err)); 
    console.log(result);
})

并发送到前端:


searchBtn.onclick = function() {
    const searchValue = document.querySelector('#search-input').value;

    fetch('http://localhost:5000/search/' + searchValue)
    .then(response => response.json())
    .then(data => loadHTMLTable(data['data']));
}

loadHTMLTable 是

    const table = document.querySelector('table tbody');

    console.log(data);

    if (data.length === 0) {
        table.innerHTML = "<tr><td class='no-data'>No Data</td><td class = 'no-data'colspan='5'>No Data</td></tr>";
        return;
    }

    let tableHtml = "";

    data.forEach(function ({id, name, time, date, rn}) {
    
        tableHtml += "<tr>";
        tableHtml += `<td>${rn}</td>`;
        tableHtml += `<td>${name}</td>`;
        tableHtml += `<td>${time}</td>`;
        tableHtml += `<td>${new Date(date).toLocaleDateString()}</td>`;
        tableHtml += `<td><button class="delete-row-btn" data-id=${id}>Delete</td>`;
        tableHtml += `<td><button class="edit-row-btn" data-id=${id}>Edit</td>`;
        tableHtml += "</tr>";
        
    });

    table.innerHTML = tableHtml;

}

我的网络应用程序上有一个用户输入的搜索名称作为 html 元素。

我得到的回报只是一个所有元素的未定义表,当我尝试 console.log 时,我得到的响应:

  [
    RowDataPacket {
      id: 15,
      name: 'Corning',
      time: '01:40:15',
      date: 2024-04-10T04:00:00.000Z,
      rn: 1
    },
    RowDataPacket {
      id: 16,
      name: 'Binghamton',
      time: '01:52:42',
      date: 2024-04-02T04:00:00.000Z,
      rn: 2
    }
  ],
  [
    RowDataPacket {
      id: 16,
      name: 'Binghamton',
      time: '01:52:42',
      date: 2024-04-02T04:00:00.000Z
    }
  ]
]

如果这是我第一次使用 SQL 或 PHPmyadmin 时非常简单的事情,我再次表示歉意,但是能够有一个专用列作为行号,在添加或删除条目时自动刷新该列会很棒。到目前为止,我发现的所有其他内容都依赖于 ROW_NUMBER,它没有设置永久列,至少对我来说不是,这不起作用,因为我的“排名”最终没有为我的表定义。

mysql node.js express
1个回答
0
投票

不,不可能有自动持久行号列。

原因是MySQL支持并发事务,因此每个会话的行号可能不同。如果我要插入一些行,但尚未提交新行,表是否应该对行重新编号?也许在我的会话中,但不是在您的会话中,您所在的事务正在查看表的旧状态。您甚至可能在会话中插入或删除了不同的行,而我的会话看不到这些行。

除此之外,任何查询都可以包含

JOIN
UNION
,或者根据
WHERE
子句中的条件从给定结果中排除行,或者根据
GROUP BY
表达式将多行聚合为更少的行。所有这些都可以更改给定查询结果的行号。

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