私は次の表を持っています
CREATE TABLE ex(
id INTEGER PRIMARY KEY,
dat DATE NOT NULL CHECK(dat IS date(dat))
);
そして、挿入するたびにdatを自動的にdate( 'now')に設定したいと思います。だから私はTRIGGERを作成しました
CREATE TRIGGER setTrigger
AFTER INSERT
ON ex
FOR EACH ROW
BEGIN
UPDATE ex
SET dat = date('now')
WHERE id = NEW.id;
END;
しかし、次のエラーが発生します:
too many levels of recursion
どうすればこれを修正できますか?
FOR EACH ROWを削除してみてください。必要はありません。これが、CHECK制約とともに再帰の原因である可能性があります。
もちろん、使用できるTRIGGERやCHECK制約も必要ありません。
CREATE TABLE ex(
id INTEGER PRIMARY KEY,
dat DATE DEFAULT CURRENT_DATE
);
あなたがしなければならない2つの列だけで注意してください INSERT INTO ex (ID) VALUES(null);
次のことも検討してください:-
トリガー再帰の最大深度
SQLiteは、再帰トリガーを含むステートメントが無制限の量のメモリを使用するのを防ぐために、トリガーの再帰の深さを制限します。
SQLiteバージョン3.6.18(2009-09-11)より前は、トリガーは再帰的ではなかったため、この制限は無意味でした。バージョン3.6.18以降、再帰トリガーがサポートされていましたが、PRAGMArecursive_triggersステートメントを使用して明示的に有効にする必要がありました。バージョン3.7.0(2009-09-11)以降、再帰トリガーはデフォルトで有効になっていますが、PRAGMArecursive_triggersを使用して手動で無効にすることができます。SQLITE_MAX_TRIGGER_DEPTHは、再帰トリガーが有効になっている場合にのみ意味があります。
デフォルトの最大トリガー再帰深度は1000です。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加