Как извлечь uuid, вставленный в строку в качестве первичного ключа через триггер - PullRequest
1 голос
/ 16 февраля 2012

Рассмотрим таблицу:

CREATE TABLE `information` (
    `id` char(36) NOT NULL,
    `data` text NOT NULL,
    PRIMARY KEY (`id`)
)

с триггером:

CREATE TRIGGER `information_uuid_ins_trg` 
BEFORE INSERT ON information 
FOR EACH ROW
BEGIN
    SET NEW.id = UUID();
END;

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

ВСТАВИТЬ В ЗНАКИ (данные) ЗНАЧЕНИЯ ('[некоторые данные]') *

Учитывая реплицированную среду master-master, в которой [некоторые данные] не гарантированно являются уникальными. Очевидно, что last_insert_id () нельзя использовать, так как это поле не является полем auto_increment. Добавление обновления временной таблицы с помощью LAST_INSERT_ID (UUID ()) не будет работать, поскольку LAST_INSERT_ID (expr) ожидает целочисленное значение как expr. В OracleRDBMS я бы подходил к этому с:

INSERT INTO information 
(data) values ('[some data]') 
RETURNING id INTO var_id

или с Microsoft SQL Server / Postgres, я бы использовал:

INSERT INTO information 
(data) values ('[some data]') 
OUTPUT INSERTED.*

Все это будет вызываться из интерфейса PHP, работающего на коллекции веб-серверов.

Есть мысли, как вернуть uuid pk в mysql?

1 Ответ

1 голос
/ 16 февраля 2012

Поскольку в MySQL, похоже, нет встроенной функциональности, чтобы помочь вам, я, к сожалению, не могу придумать ничего лучше, чем этот "взлом";

DELIMITER //

CREATE TRIGGER `information_uuid_retrieve` 
AFTER INSERT ON information 
FOR EACH ROW 
BEGIN 
  SET @INSERT_ID=NEW.id; 
END;//

DELIMITER ;

INSERT INTO information (data) VALUES ('olle');

SELECT @INSERT_ID;
+--------------------------------------+
| @INSERT_ID                           |
+--------------------------------------+
| f42f4044-58d0-11e1-8f90-93738648d450 |
+--------------------------------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...