MySQL: получить последний вставленный первичный ключ без auto_increment - PullRequest
0 голосов
/ 26 ноября 2018

Я удалил свой идентификатор записи, пока я использую уникальные хеши в качестве начального ключа.Этот первичный ключ, очевидно, не может автоматически увеличиваться.

Теперь у меня вопрос, как получить последний вставленный первичный ключ?MySQL возвращает 0 на LAST_INSERT_ID(), пока это не столбец с автоинкрементом.

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Факт

Нет эквивалента LAST_INSERT_ID(), возвращающему нецелое значение.

Можно просто

  1. Простой подход

Добавьте целочисленный столбец, который может быть автоматически увеличен или не увеличен автоматически.

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

Более сложный подход

https://stackoverflow.com/a/53481729/2323764 (@kellymandem)

Добавить вторую таблицу, управляющую идентификатором и инициируемую исходной таблицей без идентификаторов.

Невозможно

Я нашел этот очень многообещающий Q / A.

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

Упоминается, что там уже используется LAST_INSERT_ID() в выражении INSERT.

Но

INSERT INTO `table` ( `non_integer_column` ) VALUES ( LAST_INSERT_ID( 42 ) );
SELECT LAST_INSERT_ID( );
-> 42
INSERT INTO `table` ( `non_integer_column` ) VALUES ( LAST_INSERT_ID( 'a0b1c2d3e4f5' ) );
SELECT LAST_INSERT_ID( );
-> 0

Нецелочисленные значения будут игнорироваться.

0 голосов
/ 26 ноября 2018

Я думаю, что вашу проблему лучше всего решить, создав новую таблицу и триггер для отслеживания вновь вставленных значений хеша в основной таблице.

Например

CREATE TABLE test_table (
    hash VARCHAR(30) NOT NULL PRIMARY KEY,
    fullname VARCHAR(120) NOT NULL
);

CREATE TABLE hash_tracker(
    hash VARCHAR(30) NOT NULL,
    created_at DATETIME NOT NULL
);

DELIMITER $$

CREATE TRIGGER `test_trigger`
AFTER INSERT ON `test_table`
FOR EACH ROW
BEGIN
    INSERT INTO hash_tracker VALUES (NEW.`hash`, NOW());
END$$

DELIMITER ;

Затем после каждой вставки в мой test_table я могу выполнить следующий запрос

SELECT hash FROM hash_tracker ORDER BY created_at DESC LIMIT 1;

, чтобы получить последний добавленный хеш.

...