mysql_insert_id или что-то подобное, чтобы вернуть последний mysql UUID () - PullRequest
3 голосов
/ 14 января 2011

Как вы возвращаете последний сгенерированный UUID () (первичный ключ) - есть ли что-то вроде mysql_insert_id для этого?

Таблица uuidtable:

primary key: uuid uuid()
id_u (index): integer

множественный id_u, соответствующий первичному ключу uuid ()

insert: insert into uuidtable (uuid,id_u) values (uuid(),id)

где idчисло, конечно, и uuid экранируется с

uuid 

Ответы [ 5 ]

1 голос
/ 08 июля 2011

Напишите себе триггер, например:

CREATE TRIGGER ai_uuidtable
AFTER INSERT ON uuidtable
FOR EACH ROW
SET @last_uuid = NEW.uuid;

После вставки:

SELECT @last_uuid

Пользовательские переменные MySQL зависят от соединения, поэтому вам не о чем беспокоитьсяо получении другого соединения @last_uuid.

Одна проблема: если вы используете uuid в качестве ключа, для того, чтобы он был максимально производительным, он должен быть сохранен как 16-байтовый binary поле, а не 36-байтовое char поле.Если вы действительно хотите использовать алгоритм MySQL UUID(), удалите дефисы и UNHEX() it:

UNHEX( REPLACE( UUID(), '-', '' ) )

В сторону: PostgreSQL фактически имеет тип данных UUID (но не имеет встроенной функции UUID()).), что означает, что вам не нужно повторно HEX() поле, чтобы избежать попадания двоичного мусора в ваш терминал на SELECT.

0 голосов
/ 09 февраля 2017

Чтобы получить / вернуть сгенерированный базой данных-uuid, мы можем использовать переменную базы данных:

SET @uuid=UUID();
INSERT INTO uuidtable (uuid,id_u) values (@uuid,$number);
SET @uuid = IF(ROW_COUNT(),@uuid,null);#way1
SELECT @uuid;#way1
#SELECT IF(ROW_COUNT(),@uuid,null) as uuid;#way2

Мы создаем uuid перед запросом вставки и сохраняем его в @uuid. Это позволяет нам использовать его (для других таблиц, как внешний ключ) или вернуть его значение, например, использовать его в своем (php-) коде, перенаправить, позвонить или как угодно.

way1: после запроса на вставку снова установите переменную, в зависимости от успешности вставки. Если вставка завершилась неудачно, возврат нашего запроса будет нулевым, поэтому мы можем обработать его в нашем приложении, и мы избегаем использования uuid, которое, как мы думали, использовалось, но никогда не было.

way2: просто сохраните строки / запросы и оставьте переменную существующей. Наш возврат чистый, но переменная все еще находится в памяти базы данных.

Преимущество этого метода: мы можем запустить его в базе данных один раз и получить один возврат, если мы сначала запустим select, чтобы получить uuid и вставить после, мы могли бы получить потенциальную двойную задержку с помощью db-driver-network -связность.

0 голосов
/ 19 сентября 2014

Привет, единственный верный способ, который я нашел, - хранить uuid в переменной.Затем используйте переменную в запросе вставки следующим образом:

DELIMITER \\
CREATE PROCEDURE AddUserLinkRole(uname VARCHAR(50), passwd VARCHAR (40), role VARCHAR(50))
    BEGIN
        DECLARE UserUuid VARCHAR(36);
        DECLARE UserRole VARCHAR(50);
        /*Now initiate UserUuid = uuid() value*/
        SET UserUuid = uuid();
        SELECT RoleID INTO UserRoleID FROM Roles WHERE Description = role;
        /*Because I initiated UserUuid = uuid(), I can now refer to it anytime I wish using my UserUuid variable*/
        INSERT INTO Users(UserID,UserName,Password,RoleID) VALUES (UserUuid,uname,MD5(passwd),UserRoleID);
    END \\
DELIMITER ;

Надеюсь, вышеприведенное имеет смысл ..

0 голосов
/ 14 декабря 2011

Исходя из решения Ричарда , вы можете использовать триггер, чтобы получить все функции, которые вы ожидаете от обычного идентификатора автоинкремента:

CREATE TRIGGER `tablename_newid` 
BEFORE INSERT ON `tablename` 
FOR EACH ROW 
BEGIN 
    SET NEW.table_id = UNHEX(REPLACE(UUID(),'-',''));
    SET @last_uuid = NEW.table_id; 
END

Это позволит вамвыполнять вставки без ручной вставки первичного ключа UUID и автоматически сохранять автоматически сгенерированный идентификатор в переменную @last_uuid.Чтобы прочитать его обратно, просто SELECT @last_uuid, как и раньше.

В ответе Ричарда используется AFTER INSERT, что позволяет избежать проблемы с BEFORE INSERT, когда переменная UUID установлена ​​даже в случае сбоя вставки строки.Я не тестировал этот метод - хотя я чувствую, что в нормальных условиях он будет вполне нормальным, мне интересно, будут ли проблемы с репликацией кластера.

Замечания по производительности: вы заметите, что моя вставка UUID проходит черезREPLACE () и UNHEX () для сохранения его в виде 16-байтового двоичного поля - это всего лишь 4-кратное пространство хранения обычного первичного ключа INT (и только в два раза больше, чем у BIGINT), и будет значительно быстрее запрашивать, чем строковые ключи UUID.

При запросе и чтении таких двоичных значений функции MySQL HEX() и UNHEX() будут очень полезны, как и запись значений запроса в шестнадцатеричной записи (предшествует 0x).

0 голосов
/ 14 января 2011

Я не уверен, что это даже возможно сделать в mysql.

Единственное очевидное решение, которое я могу найти, это сгенерировать UUID() в отдельном запросе и затем вставить запись с известным идентификатором.

...