Mysql 在另一个字段中重用自动插入的生成字段
我正在开发一个应用程序,该应用程序将为用户填写的表单生成对开本, 在内部,我将处理一个documentId,它将自动递增,但是我必须生成客户端的 不同格式的对开本Mysql 在另一个字段中重用自动插入的生成字段,mysql,sql,database,Mysql,Sql,Database,我正在开发一个应用程序,该应用程序将为用户填写的表单生成对开本, 在内部,我将处理一个documentId,它将自动递增,但是我必须生成客户端的 不同格式的对开本 示例: Folio 100613A100 10 - day 06 - month 13 - year A - if regular E - if special 100 - AI number 基本上我可以从我的PHP代码中找到前7位数字,但是因为我不知道AI数字是多少,所以我可以创建 该值直到插入完成为止 我目前的方法是在不填
示例:
Folio 100613A100
10 - day
06 - month
13 - year
A - if regular
E - if special
100 - AI number
基本上我可以从我的PHP代码中找到前7位数字,但是因为我不知道AI数字是多少,所以我可以创建
该值直到插入完成为止
我目前的方法是在不填充该字段的情况下进行插入,并在插入后立即使用LAST\u insert\u ID()
生成对开本并更新表,但这对我来说是一种开销,所以我想知道是否有隐藏的宝石
在MySql中,这将允许在insert上使用AI值
请注意,我不能在插入之前使用
LAST\u INSERT\u ID(),我的实现工作得很好,我没有任何问题。我只是想知道,为了获得一点知识,是否有可能。您可以在插入触发器后使用。请参阅本手册:您可以在插入前使用触发器和用于排序的单独表格(如果您不介意的话)在插入时生成对开本编号
首先是排序表
CREATE TABLE table1_seq
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY);
你真正的桌子
CREATE TABLE Table1
(`id` INT NOT NULL DEFAULT 0,
`folio` VARCHAR(32)
...
);
扳机
DELIMITER $$
CREATE TRIGGER tg_table1_insert
BEFORE INSERT ON Table1
FOR EACH ROW
BEGIN
INSERT INTO table1_seq VALUES (NULL);
SET NEW.id = LAST_INSERT_ID();
SET NEW.folio = CONCAT(DATE_FORMAT(CURDATE(), '%d%m%y'), UPPER(NEW.folio), NEW.id);
END$$
DELIMITER ;
现在您可以插入新记录了
INSERT INTO Table1 (`folio`, ...)
VALUES ('a', ...), ('e', ...);
你的桌子上有
| ID | FOLIO |...
-----------------...
| 1 | 160613A1 |...
| 2 | 160613E2 |...
然后使用此存储过程插入新记录
DELIMITER $$
CREATE PROCEDURE sp_table1_insert (IN folio_type VARCHAR(1), ...)
BEGIN
DECLARE newid INT DEFAULT 0;
START TRANSACTION;
INSERT INTO table1 (id, ...) VALUES (NULL, ...);
SET newid = LAST_INSERT_ID();
UPDATE table1
SET folio = CONCAT(DATE_FORMAT(CURDATE(), '%d%m%y'), UPPER(folio_type), newid)
WHERE id = newid;
COMMIT;
END$$
DELIMITER ;
CALL sp_table1_insert ('a',...);
CALL sp_table1_insert ('e',...);
这里是这方面的演示。解释为什么您认为这是一种开销?我在为1条记录生成数据的同时,对数据库执行了两次命中操作。第二次命中以获取最后一个插入id对于数据库来说基本上是零功。虽然它在最纯粹的意义上是开销,但它可能是您可以进行的最便宜的DB操作之一,因此我不担心它。为什么不在检索数据时附加id呢?在同一行中有两个相同的id似乎是多余的,只是为了澄清我是否正确理解一个表中的两列:documentid
,这是应该生成的自动增量
和对开本
?您能说明如何生成吗?在MySql中,插入触发器后不能更改中的NEW
值。你说“插入触发器后不能更改新值”是什么意思?我的意思和我说的一模一样:在插入后的触发器中,您可以访问自动递增列的值,但不能更改任何列值。@isJustMe非常欢迎:)有关简单的SP方法,请参阅更新的答案。