insert命令中的用户定义函数

时间:2016-04-16 14:30:23

标签: mysql stored-procedures

我创建了一个函数:

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'不能为空

1 个答案:

答案 0 :(得分:0)

您的RETURN

出了问题

也许你有意义这样做,虽然我只是在猜测:

RETURN CONCAT(
            (select ifnull(max(id), 0) + 1
             from heenaj),
             substring(a,1,2),
             substring(b,1,2));

sqlfiddle

然后,您正在呼叫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中),我选择了/作为我的分隔符。您可以将/更改为$$,因为您将分隔符设置为$$