2016-04-16 27 views
1

Iは、関数を作成した:ユーザ定義関数

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); 

それがエラーを示しています。

Column 'c_id' cannot be null

答えて

0

RETURNに問題があります。

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

sqlfiddle

を次に、あなたがcustomerid121()ないcustomer_id()を呼び出している:私は推測していますが、

たぶん、あなたは、これを行うために意味されています。これはタイプミスでしょうか?

はまた、あなたが何をしようとして見てに:あなたはしたいですか、あなたのidauto_incrementとしてだけnameの最初の2つの文字を連結し、numberの最初の2つの文字を連結し、idとしてc_idをしたいですか?

私は別の解決策を提案します。あなたはあなただけc_idを無視して、次のように挿入することができます挿入すると、

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/ 

この方法:あなたの関数をドロップすると、INSERT前のためTRIGGERを作成し、このようにしてよりよいかもしれません

insert into heenaj(name,number) 
values ("abcd",9868); 

トリガーはc_idの設定を処理します。 sqlfiddle for TRIGGER

P.S. (sqlfiddleの)トリガーを作成するために、/を私の区切り文字として選択しました。区切り文字を$$と設定しているため、/$$に変更することができます。

+0

はい、どうもありがとうございました。 :)それは本当に助けになった –

関連する問題