如何在没有主键的情况下唯一标识 MySQL table 中的所有行?

How to uniquely identify all rows in a MySQL table without a primary key?

我使用 MySQL(在 NodeJS 中)。我有一个 table 的未知数据。

我通过循环出项目将数据呈现为 HTML table。然后我向单元格添加一个点击事件。当发生这种情况时,我想从当前单元格加载数据。

我该怎么做?

我能做什么(但不想)

我可以让用户添加一个custom_identifier来指定在这个table中,使用id作为标识符。

/*
From click event. I click on the cell with `column slug` with `id 3`.

cell = {
  identifier: 3,
  column: slug,
};
*/
const custom_identifier = "id";
const sql = `SELECT ${cell.column} FROM WHERE ${custom_identifier} = ${cell.identifier}`;

因为这种方法需要用户为每个table指定标识符,所以我不想使用这种方法。

问题

当进行 SQL 查询并需要特定行时,我们需要一个 WHERE 语句和一个标识符来获取正确的行。有些 table 根本没有 ID,甚至没有唯一标识符。

问题

如何从不知道 ID 的行中获取数据?

想法

您可以使用 this technique 为每一行添加一个行号。这是一个用于生成 ID 列的示例,该列具有从零开始递增的整数值:

SELECT @idvar := @idvar + 1 AS id,
       tbl.*
FROM tbl, 
     (SELECT @idvar := -1) alias;

由于无法保证 SELECT 的结果顺序,您可能需要使用它来创建临时 table 或非临时 table 即稍后删除 - 例如:

CREATE TABLE new_tbl AS 
SELECT @idvar := @idvar + 1 AS id,
       tbl.*
FROM tbl, 
     (SELECT @idvar := -1) alias;

注意:如果 id 已经是 table 中现有列的名称,您将收到“重复列名称 'id'”错误。因此,除非您知道情况并非如此,否则值得使用更晦涩的列别名,例如id_zyxwv 或其他一些官方文章。

在此处查看工作演示:https://rextester.com/DVRGNM12570