問題タブ [mysql-error-1442]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
2783 参照

mysql - MySQLトリガー:テーブルが大きくなりすぎた場合、行を削除できますか?

テーブル T に新しい行を挿入するとき、テーブルが特定のしきい値よりも大きいかどうかを確認し、その場合は最も古いレコードを削除します (最終的にある種の FIFO を作成します)。

単純にトリガーを作成できると思っていましたが、MySQL では、実際に挿入しているテーブルの変更が許可されていないようです。

これが私が試したトリガーです:

データベース内でこれを行う方法について何か考えはありますか?

それとも、明らかに私のプログラムで行うべきことですか?

0 投票する
2 に答える
25036 参照

mysql - mysqlトリガーストアードトリガーは、ストアードトリガーを呼び出したステートメントによってすでに使用されています

更新時に予測フィールドが=3の場合、トリガーが値を4に変更してデータベースに保存するように、トリガーを設定したいと思います。トリガーは以下のとおりです。

何らかの理由で、次のようなエラーが発生し続けます。

これは正しい方法で設定されていますか?

0 投票する
1 に答える
24387 参照

mysql - MySQL:新しい行の作成日を設定するためのトリガーを作成する方法

データベースに2つのTIMESTAMP列を作成しようとしたときに、問題が発生しました。1つはと呼ばれcreated、もう1つはと呼ばれupdatedます。列の両方のデフォルト値CURRENT_TIMESTAMPを設定するのは簡単だと思いました。しかし、何らかの理由でMySQLはそれが悪い考えであることを意味します...それで、私は挿入クエリでそれらの1つを設定する必要なしにこれを行う方法を探していました。ON UPDATE CURRENT_TIMESTAMPupdated

この回答でトリガーを使用して1つの方法を見つけましたが、エラーが発生し続けます。実際にトリガーを作成できましたが、新しい行を挿入しようとするとエラーが発生します。

1442-このストアド関数/トリガーを呼び出したステートメントによって既に使用されているため、ストアド関数/トリガーのテーブル'タスク'を更新できません。

そして、それが何を意味するのかまったくわかりません。だから、私はここの誰かがこの主題に光を当てることができることを望んでいました。

テーブルとトリガーの作成に使用したSQLは次のとおりです。

私はここで何が間違っているのですか?

0 投票する
3 に答える
3561 参照

mysql - ツリーでノードレベルを検索する

次のようにツリー(ネストされたカテゴリ)が保存されています。

クライアント側の言語(PHP)にノード情報(子+親)をフィードして、メモリ内にツリーを構築できるようにする必要があります。PHPコードを微調整することはできますが、すべての親が子の前に来るような順序で行を取得できれば、操作ははるかに簡単になると思います。各ノードのレベルを知っていれば、それを行うことができます。

ノードレベルを計算する方法(表示、保存されたルーチンなど)を考えられますか?リアルタイムでなくても大丈夫だと思います。ノードの変更時に再計算する必要があります。

最初の更新:これまでの進捗状況

Amarghoshによるフィードバックに基づいて、これらのトリガーを作成しました。

挿入や変更には問題なく機能するようです。ただし、削除には機能しません。行がON UPDATE CASCADE外部キーから更新された場合、MySQLサーバーはトリガーを起動しません。

最初の明白なアイデアは、削除の新しいトリガーを作成することです。ただし、テーブルのトリガーは、categoriesこの同じテーブルの他の行を変更することはできません。

エラー:

グリッド編集エラー:SQLエラー(1442):このストアド関数/トリガーを呼び出したステートメントによって既に使用されているため、ストアド関数/トリガーのテーブル'category'を更新できません。

2番目の更新:実用的な解決策(間違っていることが証明されない限り)

私の最初の試みはかなり賢明でしたが、解決できない問題を見つけました。トリガーから一連の操作を起動すると、MySQLは同じテーブルの他の行を変更できなくなります。ノードの削除ではすべての子孫のレベルを調整する必要があるため、壁にぶつかりました。

最後に、ここからコードを使用してアプローチを変更しました。ノードが変更されたときに個々のレベルを修正するのではなく、すべてのレベルを計算するコードがあり、編集するたびにトリガーします。計算が遅く、データのフェッチには非常に複雑なクエリが必要なため、テーブルにキャッシュします。私の場合、エディションはまれであるはずなので、これは許容できる解決策です。

1.キャッシュレベルの新しいテーブル:

2.レベルを計算するヘルパー関数

それがどのように機能するかを本当に理解したとしても、それ自体では有用なものは何も返されません。代わりに、セッション変数にデータを格納します。

3.再計算プロセスを開始する手順

基本的に、ヘルパー関数によって支援されるレベルを取得する複雑なクエリをカプセル化します。

4.キャッシュテーブルを最新の状態に保つためのトリガー

5.既知の問題

  • ノードが頻繁に変更される場合は、かなり最適ではありません。
  • MySQLは、トリガーとプロシージャでのトランザクションまたはテーブルのロックを許可していません。ノードを編集する場合は、これらの詳細に注意する必要があります。
0 投票する
2 に答える
36348 参照

mysql - 同じテーブルで更新した後、トリガーでテーブルを更新しています

同じテーブルで更新した後、トリガーでテーブルの列を更新するにはどうすればよいですか?
トリガーは次のとおりです。

今、私が次のようにテーブルを更新すると

私は次のようになりますので、これは機能しません:

では、一体どうやってこれを機能させることができるのでしょうか?

0 投票する
1 に答える
326 参照

mysql - トリガー内で呼び出されたプロシージャのmysql5.2.3構文エラー

これをテーブルに使用すると、行を挿入しようとするとエラー1442が発生します。

ありがとう

0 投票する
2 に答える
4730 参照

mysql - 同じテーブル内の子レコードを削除するMySqlトリガー

親レコードと子レコードを格納するテーブルがあります。

親が削除されたときにすべての子レコードを削除するトリガーを作成しようとしていました:

トリガーを正常に保存できますが、削除すると次のエラーが発生します。

エラー 1442: これを呼び出したステートメントで既に使用されているため、ストアド関数/トリガーのテーブル 'tbl' を更新できません

私は何を間違っていますか?

0 投票する
3 に答える
11505 参照

mysql - エラー 1442: このストアド関数/トリガーを呼び出したステートメントで既に使用されているため、ストアド関数/トリガーのテーブルを更新できません

必要なテーブルがあります。テーブルが更新されると、その 2 つのフィールド (タイトルと説明) が変更され、別のテーブルから値が取得されます。

これは私のトリガーです:

私のテーブル:

  • trade_request_type
  • trade_request

エラー:

エラー 1442 : このストアド関数/トリガーを呼び出したステートメントで既に使用されているため、ストアド関数/トリガーのテーブル 'trade_request' を更新できません。

それは動作しません!問題は何ですか?

0 投票する
1 に答える
7803 参照

mysql - mysql エラー 1442 の本当の原因は何ですか?

mysql error #1442さて、私はインターネット上で多くの場所を探しました。

このストアド関数/トリガーを呼び出したステートメントで既に使用されているため、ストアド関数/トリガーのテーブル 'unlucky_table' を更新できません

これはmysqlのバグか、mysqlが提供しない機能であると言う人もいます。

MySQL トリガーは、割り当てられているテーブルを操作できません。他のすべての主要な DBMS はこの機能をサポートしているため、MySQL がこのサポートをすぐに追加することを願っています。

これは、レコードを挿入するときの再帰的な動作が原因であると主張する人もい ます。mysql は何らかのロック処理を行っています。挿入した同じテーブルの行を挿入/更新/削除することはできません..トリガーが何度も呼び出されるため..再帰に終わる

挿入/更新中に、関連するテーブルのすべてのフィールドを含む NEW オブジェクトにアクセスできます。新しいオブジェクトで変更するフィールドを挿入/更新および編集する前に実行すると、呼び出しステートメントの一部になり、個別に実行されません (再帰を排除します)。

なぜこれが再帰的なのか理解できません。私は2つのテーブルがtable1ありtable2、SQLクエリを次のように実行する場合があります

今、私はafter update triggerオンにtable1なっています

更新クエリを実行すると、1442 エラーが発生します。この場合、何が再帰的ですか?

0 投票する
1 に答える
512 参照

mysql - テーブル 1 を更新する after insrt トリガーを持つテーブル 2 に挿入するテーブル 1 の mysql After insert トリガー

fs_tableの特定の行を新しい値で更新する必要がある挿入後トリガーを持つdumy_fs_tableに、計算されたデータを含む行を挿入するfs_table の Insert 後および Delete トリガーの後に作成したfs_noteと呼ばれるもう1 つのテーブルはdumy_fs_noteと呼ばれます。問題は、今私がエラーを抱えていることです:それはなぜですか?? 同じテーブルではなく fs_table を更新しようとしているのは dumy_fs_note テーブルです。何が問題なのですか? 前もって感謝します



#1442 Can't update table 'fs_note' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.