0

私はMySQL関数の分野に慣れていませんが、これを適切に機能させることができないようです. 基本的に、この特定のテーブルから SELECT クエリを実行するたびに、次の増分値が表示されます。

ここに私のテーブルがあります:

CREATE TABLE testdb.id_generator(
  invoice_id INT(11) NOT NULL,
  PRIMARY KEY (invoice_id)
)
ENGINE = INNODB
AVG_ROW_LENGTH = 16384
CHARACTER SET latin1
COLLATE latin1_swedish_ci;

関数は次のとおりです。

CREATE 
FUNCTION testdb.f_id_test()
  RETURNS INT(11)

BEGIN
  DECLARE v_val INT;
  DECLARE c_select CURSOR FOR SELECT invoice_id
                              FROM
                                id_generator;

  OPEN c_select;

  FETCH c_select INTO v_val;
  CLOSE c_select;

  UPDATE id_generator
SET
  invoice_id = invoice_id + 1;
  RETURN v_val;
END

クエリを実行しようとするたびに

  SELECT f_id_test()
  FROM
  id_generator  

「このストアド関数/トリガーを呼び出したステートメントで既に使用されているため、ストアド関数/トリガーのテーブル 'id_generator' を更新できません」と表示されます。ここで何が間違っていますか?

4

1 に答える 1

2

ステートメントを実行するときは、「FROM id_generator」なしで試してください。基本的には次のとおりです。

SELECT f_id_test()

関数は既に id_generator テーブルからデータを取得しており (したがって、FROM 句はデータを変更しません)、エラーは、関数が更新しようとしているのと同じテーブルを SELECT ステートメントが使用していることを示しています。

于 2013-01-28T23:55:19.260 に答える