Как однозначно идентифицировать все строки в таблице MySQL без первичного ключа? - PullRequest
0 голосов
/ 18 июня 2020

Я использую MySQL (в NodeJS). У меня есть таблица с неизвестными данными.

Я представляю данные в виде таблицы HTML путем зацикливания элементов. Затем я добавляю в ячейки событие щелчка. Когда это произойдет, я хочу загрузить данные из текущей ячейки.

Как я могу это сделать?

Что я могу сделать (но не хочу)

Я мог бы позволить пользователю добавить custom_identifier, чтобы указать, что в этой таблице, используйте идентификатор в качестве идентификатора.

/*
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}`;

Поскольку этот подход требует, чтобы пользователь указывал идентификатор для каждой таблицы, я не хотите использовать этот подход.

Проблема

При выполнении SQL запросов и желании определенной строки нам нужен оператор WHERE и идентификатор, чтобы получить правильную строку. Некоторые таблицы вообще не имеют идентификатора или даже уникального идентификатора.

Вопрос

Как я могу получить данные из строки, идентификатор которой мне неизвестен?

Идеи

  • Есть ли какой-то индекс, который я мог бы использовать, который не привязан к имени столбца?
  • Я могу добавить больше вещей в свои атрибуты данных в HTML если нужно, index или что-то еще. Я просто не хочу загружать пользователя.

1 Ответ

2 голосов
/ 29 июня 2020

Вы можете использовать эту технику , чтобы добавить номер строки к каждой строке. Вот пример его использования для генерации столбца идентификатора с увеличивающимися целочисленными значениями, начиная с нуля:

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

Поскольку порядок результатов из SELECT не гарантируется, вам может потребоваться использовать это чтобы создать временную или невременную таблицу, которая позже будет удалена, например:

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

Примечание. Вы получите ошибку «Повторяющееся имя столбца 'id'», если id - это уже имя существующего столбца в таблице. Так что, если вы не знаете, что это не может быть так, возможно, стоит использовать более неясное имя псевдонима столбца, например id_zyxwv или какой-нибудь другой треп.

См. Рабочую демонстрацию здесь: https://rextester.com/DVRGNM12570

...