次の表があります。
CREATE TABLE methods (
id INTEGER NOT NULL,
version INTEGER NOT NULL,
text TEXT NOT NULL,
PRIMARY KEY (id,version)
);
新しい行でnullのときに列「id」を自動インクリメントしたいと思います。また、列「バージョン」を1に設定したいと思います。
自動インクリメント値を sqlite_sequence に保存したいと思います。
「id」で行が挿入されたら、「version」を1つ増やしたい。
これをアプリケーション レベルで複製しましたが、データベース レベルで必要であり、1 つまたは 2 つのトリガーを作成する必要があることを理解しています。
ありがとう
アップデート:
これは単にドキュメントをバージョン管理するためのパターンであり、最適ではない可能性があり、安全ではない可能性があります。誰かがこれに問題があるか、実装するためのより良いアプローチを見ていますか?
更新 2:
現在のバージョンを追跡するために、列「現在」を追加しました。
更新時に、その ID の最高バージョンを取得してから 1 を追加するクエリを追加しました。
また、最新バージョン以外の更新を防ぐために別のトリガーを追加しました。
私はこれを機能させました:
CREATE TABLE IF NOT EXISTS 'methods' (
'id' INTEGER NULL,
'version' INTEGER NULL,
'current' INTEGER NOT NULL DEFAULT 0,
'name' TEXT NOT NULL,
PRIMARY KEY ('id','version')
);
INSERT INTO sqlite_sequence (name,seq) VALUES ('methods',0);
CREATE TRIGGER method_insert AFTER INSERT ON "methods" WHEN (NEW.id IS NULL)
BEGIN
UPDATE sqlite_sequence SET seq = seq + 1 WHERE name = 'methods';
UPDATE methods SET id = (
SELECT seq FROM sqlite_sequence WHERE name = 'methods'
), version = 1 WHERE ROWID = NEW.ROWID;
END;
CREATE TRIGGER method_update_not_current BEFORE UPDATE ON methods WHEN (OLD.current != 1)
BEGIN
SELECT RAISE(ABORT,'Only current version of method can be updated.');
END;
CREATE TRIGGER method_update AFTER UPDATE ON methods WHEN (OLD.id == NEW.id)
BEGIN
UPDATE methods SET current = 0 WHERE id = OLD.id;
UPDATE methods SET version = (
SELECT MAX(version) FROM methods WHERE id = OLD.id
) + 1 WHERE ROWID = OLD.ROWID;
INSERT INTO methods (id,version,name) VALUES (OLD.id,OLD.version,OLD.name);
END;
INSERT INTO methods (name) VALUES ('Test');
INSERT INTO methods (name) VALUES ('Test2');
UPDATE methods SET name = 'Tested' WHERE id = 1;
SELECT * FROM methods;
1|2|1|Tested
2|1|1|Test2
1|1|0|Test