0

T-SQL から MySQL に作成した関数を再作成しようとしていますが、トリガーを機能させるのに苦労しています。

ここで私がやるべきことは次のとおりです: 1. この形式に基づいて特殊化 ID を作成する関数を作成する必要があります: 日付 - 増分の実際の ID になる 6 桁のコード

  1. 次に、新しいレコードを挿入しようとするたびに、作成した関数を呼び出して ID を生成するトリガーを作成する必要があります。

これが私がしたことです:

-- created the table first
DROP TABLE abc
Create table abc
(
    IDnumber INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name varchar(32)
)

-- Function
DROP FUNCTION GenerateID

 CREATE FUNCTION GenerateID (id int)
 RETURNS VARCHAR(10) 
       RETURN CONCAT(substr((cast(CURDATE() as char(10))),3,2), '-', right(concat('000000', cast( id as char(6) ) ), 6) );


-- create the Trigger

    DELIMITER ||
CREATE TRIGGER ID_Insert BEFORE INSERT ON ABC
FOR EACH ROW 
BEGIN
    UPDATE abc
        SET abc.IDNumber = generateID(abc.IDNumber) ;
--     FROM abc 
--    INNER JOIN Inserted ON abc.IDNumber = inserted.IDNumber;
END

||

--FROM abc と -- INNER JOIN の部分をコメントアウトしました。これは、T-SQL で使用した構文であるためです。ここに適用しようとしましたが、構文エラーが発生します。これでトリガーは正常に作成されましたが、問題はレコードの挿入を開始したときです。

 insert into abc (name) values('cammie')
  insert into abc (name) values('helios')
etc

「この関数/sp を呼び出したステートメントで既に使用されているため、トリガー/関数を使用してテーブルを更新できない」というエラー 1442 が表示されます。

私に何が欠けていると思いますか?

4

1 に答える 1

1

トリガー本体では、既に更新されているテーブルを更新しようとする代わりに、単に使用します

SET NEW.IDNumber = generateID(abc.IDNumber) ;
于 2013-05-31T20:13:15.087 に答える