DELIMITER$$
DROP PROCEDURE IF EXISTS sp_Generar_Codigo$$
CREATE PROCEDURE sp_Generar_Codigo(
OUT p_codigo_secundario VARCHAR(4)
)
BEGIN
DECLARE contador INT;
BEGIN
SET contador= (SELECT COUNT(*)+1 FROM Producto);
IF(contador<10)THEN
SET p_codigo_secundario= CONCAT('P00',contador);
ELSE IF(contador<100) THEN
SET p_codigo_secundario= CONCAT('P0',contador);
ELSE IF(contador<1000)THEN
SET p_codigo_secundario= CONCAT('P',contador);
END IF;
END IF;
END IF;
END;
END$$
Christopher 提出的基于 Leando 的解决方案非常好。尽管如此store procedure,它会使用触发器来完成它,这样在将新产品插入表中之前,会计算第二个字段。例如,这将是一个可以解决此问题的触发器:
CREATE TRIGGER trigger_name BEFORE INSERT ON tabla_productos FOR EACH ROW
BEGIN
DECLARE next_id INT;
SET next_id = (SELECT AUTO_INCREMENT FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='tabla_productos');
SET NEW.codigo_secundario = CONCAT('P', LPAD(next_id, 8, '0'));
END
CREATE TRIGGER trigger_name BEFORE INSERT ON tabla_productos FOR EACH ROW
BEGIN
DECLARE next_id INT;
SET next_id = (SELECT LAST_INSERT_ID() FROM tabla_productos Limit 1;
SET NEW.codigo_secundario = CONCAT('P', LPAD(next_id + 1, 8, '0'));
END
正如 Leandro 告诉您的,建议表的标识符代码是数字数据,您可以做的是一个额外的字段,用作第二个代码,可能称为 code_secondary。你可以用存储过程来做到这一点,我给你一个小例子:
有了它,您可以根据需要使用结构“P001”生成代码
Christopher 提出的基于 Leando 的解决方案非常好。尽管如此
store procedure
,它会使用触发器来完成它,这样在将新产品插入表中之前,会计算第二个字段。例如,这将是一个可以解决此问题的触发器:分部分解释代码:
声明了一个变量以从模式中检索下一个要使用的 id(因为它是自动增量的并且触发器在插入之前运行,我们没有id 的值
该字段被设置
codigo_secundario
为下一个要插入的 id,前面有一个零填充(填充),直到完成一个长度为 8 的字符串以及带有字母的前缀P
。8的长度,我拿它是因为它可以让你10^8-1
总共拥有产品。如果您估计您将拥有超过 99,999,999 种产品,请增加此值,如果您的产品数量少于该值,则将其减少。我希望我有所帮助。
干杯
表的标识符不是这样设计的,id 必须是简单的东西,一个序号或 guid。
不建议使用计算字段,因为它不符合标准格式
数据库规范化
在您的情况下定义一个连续的数字字段,该字段取值 1,2,3 等,然后是另一个代表字母 P 的字段,我无法告诉您该字段的名称,因为它与业务相关
当您向用户显示数据时,您可以通过将字母字段与数字顺序连接来组成值
如果是 php,您可以使用str_pad
所以在代码前面添加零。
我遇到了同样的问题,我做了一些研究,他们建议我不要使用
information_schema
,而是更推荐使用LAST_INSERT_ID()
和Limit 1
扳机: