我正在开发一个应用程序,它将为用户创建的某些表单填充生成作品集, 在内部我将处理一个将自动递增的documentId,但是我必须生成客户端 不同格式的作品集 示例:
Folio 100613A100
10 - day
06 - month
13 - year
A - if regular
E - if special
100 - AI number
基本上我可以从我的PHP代码中输入前7位数,但是因为我不知道我能创建的AI编号是什么 这个值直到插入完成,
我目前的做法是在不填充该字段的情况下进行插入,并在插入后使用LAST_INSERT_ID()
生成Folio并更新表格,但这对我来说是一种开销,所以我想知道是否有任何隐藏的宝石
在MySql中允许在插入上使用AI值。
请注意,我无法在插入之前使用LAST_INSERT_ID()
id ,因为该应用将具有并发访问权限,我的实现工作正常,我没有任何问题我只是想知道是否可以获得一点知识。
答案 0 :(得分:2)
您可以使用BEFORE INSERT
触发器和单独的表格(如果您不介意)在插入时生成对开页码,以便进行排序。
首先是排序表
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', ...);
你的表1中有你的
| ID | FOLIO |... -----------------... | 1 | 160613A1 |... | 2 | 160613E2 |...
这是 SQLFiddle 演示。
另一种方式只是将INSERT
和UPDATE
包装在存储过程中
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',...);
以下是 SQLFiddle 演示。
答案 1 :(得分:1)
您可以使用插入后触发器。请参阅本手册:http://dev.mysql.com/doc/refman/5.0/en/create-trigger.html