2

在我的表(MySQL)中,我有这些字段:

id - 主要的,自动增量

hash- base 36 表示id

我想一次填充这两个字段,使用存储过程来计算 id 在 INSERT 上接收到的值的 base 36 等效值。像这样的东西:

INSERT into `urls` (`id`,`hash`) VALUES (NULL,base36(`id`));

显然这是行不通的,但我希望它能说明我正在努力实现的目标。这可能吗?如果可以,怎么做?

注意:我只想使用一个查询,所以 last_insert_id 没有帮助(至少据我所知)。

4

3 回答 3

5

这个问题本质上是对另一个问题的重述。简而言之,自动增量字段的优点是保证该值是唯一的,缺点是该值在 INSERT 已经执行之前不存在。

这是必然的。例如,您可以为给定的表检索下一个自动增量值是什么,但由于并发问题,您不能确定接下来执行的查询将是获得该 ID 的查询。别人可能会先拿走它。因此,ID 字段的分配必须是在插入记录时发生的原子 get-and-increment 操作。

换句话说,尽管您可能在单个查询中执行此操作,但您根本不会这样做。理论上,您可以通过在 INSERT 上附加一个触发器来假装您只执行一个查询,该触发器在事后添加您的 ID 字段的替代表示。或者,您可以使用基于提前知道的内容的非自动增量 ID 字段。

于 2009-04-20T07:22:50.217 回答
2

尽管您不能在单个查询中执行此操作,但您可以执行以下操作:

START TRANSACTION;
INSERT into `urls` (`id`) VALUES (NULL);
UPDATE `urls` SET `hash`=BASE36(`id`) WHERE `id`=LAST_INSERT_ID();
COMMIT;
于 2009-04-20T07:46:02.920 回答
0

您可以使用触发器来执行此操作,例如:

CREATE TRIGGER `calc_id_hash` AFTER INSERT ON `urls`
FOR EACH ROW SET new.`hash`= BASE36(new.`id`);
于 2009-04-20T09:48:32.207 回答