SQLite - используйте составной первичный ключ и автоинкремент обоих столбцов - PullRequest
1 голос
/ 13 марта 2011

У меня есть следующая таблица:

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


...