我创建了一个函数:
DELIMITER $$
DROP FUNCTION IF EXISTS `heena`.`customer_id`$$
CREATE DEFINER=`root`@`localhost` FUNCTION `heena`.`customer_id`(
a varchar(20),
b varchar(20)
) RETURNS varchar(50) CHARSET latin1
DETERMINISTIC
BEGIN
RETURN CONCAT(
(select ((id), 0) + 1
from heenaj),
substring(a,1,2),
substring(b,1,2));
END;$$
DELIMITER ;
代码执行正常,但是当我使用以下方法插入值时:
insert into heenaj
(c_id,name,number)
values
(customer_id121("abcd",9868275817),"abcd",9868275817);
显示错误:
列'c_id'不能为空
答案 0 :(得分:0)
您的RETURN
。
也许你有意义这样做,虽然我只是在猜测:
RETURN CONCAT(
(select ifnull(max(id), 0) + 1
from heenaj),
substring(a,1,2),
substring(b,1,2));
然后,您正在呼叫customerid121()
而不是customer_id()
。这可能是拼写错误吗?
此外,在查看您要执行的操作时:您希望将id
设为auto_increment
,并希望将c_id
设为id
,连接使用name
的前2个字符并与number
的前2个字符连接?
我建议另一个解决方案。放弃功能并在TRIGGER
之前创建INSERT
可能更好,如下所示:
CREATE TRIGGER set_customer_id BEFORE INSERT on heenaj
FOR EACH ROW
BEGIN
SET NEW.c_id = CONCAT((SELECT IFNULL(MAX(id),0)+1 FROM heenaj),SUBSTRING(NEW.name,1,2),SUBSTRING(NEW.number,1,2));
END/
这样,当你插入时,你可以忽略c_id
并插入如下:
insert into heenaj(name,number)
values ("abcd",9868);
触发器将为您处理c_id
的设置。
sqlfiddle for TRIGGER
P.S。为了创建触发器(在sqlfiddle中),我选择了/
作为我的分隔符。您可以将/
更改为$$
,因为您将分隔符设置为$$
。