У меня есть следующая таблица:
CREATE TABLE methods (
id INTEGER NOT NULL,
version INTEGER NOT NULL,
text TEXT NOT NULL,
PRIMARY KEY (id,version)
);
Я бы хотел, чтобы столбец 'id' автоматически увеличивался при нулевом значении в новой строке, я также хотел бы, чтобы для столбца 'version' было установлено значение1.
Я хотел бы сохранить значение автоинкремента в sqlite_sequence.
Когда строка вставлена с 'id', я бы хотела, чтобы 'version' увеличилась на 1.
Я повторил это на уровне приложения, но мне нужно на уровне базы данных, и я понимаю, что мне придется создать триггер или два.
Спасибо
Обновление:
Это просто шаблон для версии документа, он может быть не лучшим и небезопасным.Кто-нибудь видит что-то не так с этим или лучшим подходом к реализации?
Обновление 2:
Я добавил столбец 'current', чтобы отслеживать текущую версию.
КогдаОбновление Я добавил запрос, чтобы получить самую высокую версию для этого идентификатора, а затем добавил 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