Python SQLite3 auto_increment корректно увеличивается даже при удалении максимального идентификатора - PullRequest
0 голосов
/ 04 апреля 2020

Gday,

Я начинаю работать с базой данных SQL в python и хочу иметь несколько таблиц, где я могу ссылаться на строки в таблице друг друга по идентификатору. Поэтому я использую столбец «testID integer PRIMARY KEY».

Значение столбца увеличивается по желанию, но если я удаляю строку с максимальным идентификатором, а затем добавляю другую запись, он получит идентификатор который был установлен уже раньше. Это работает, потому что удаление самой последней строки приводит к более низкому максимальному идентификатору в столбце, что имеет смысл для меня.

Мне было интересно, есть ли способ, чтобы база данных запоминала каждый идентификатор, который был установлен ранее и не устанавливать один и тот же идентификатор дважды, даже если максимальный идентификатор удален из базы данных?

MWE, чтобы сделать это более понятным:

conn = sqlite3.connect("db_problem.db")
c = conn.cursor()
with conn:
    c.execute("CREATE TABLE test ("
              "testID integer PRIMARY KEY, "
              "col1 integer)")
    c.execute("INSERT INTO test (col1) VALUES (1)")
    c.execute("INSERT INTO test (col1) VALUES (2)")
    c.execute("DELETE FROM test WHERE col1 LIKE 1")
    c.execute("SELECT testID FROM test WHERE col1 LIKE 2")
    print(c.fetchall()) # this stays 2, even tho there is only one row left, which works fine
    c.execute("INSERT INTO test (col1) VALUES (3)")
    c.execute("DELETE FROM test WHERE col1 LIKE 3")
    c.execute("INSERT INTO test (col1) VALUES (4)")
    c.execute("SELECT testID FROM test WHERE col1 LIKE 4")
    print(c.fetchall()) # Here the autoincrement was set to 3 although it is the fourth entry made

1 Ответ

1 голос
/ 04 апреля 2020

С Автоинкремент SQLite :

Если после INTEGER PRIMARY KEY появляется ключевое слово AUTOINCREMENT, это изменяет автоматический алгоритм назначения c ROWID, чтобы предотвратить повторное использование ROWID по сравнению с время жизни базы данных. Другими словами, целью AUTOINCREMENT является предотвращение повторного использования ROWID из ранее удаленных строк.

Итак, создайте таблицу с помощью этого оператора:

c.execute("CREATE TABLE test ("
          "testID integer PRIMARY KEY AUTOINCREMENT , "
          "col1 integer)")

Но есть и другой часть документации, которую вы должны учитывать:

Ключевое слово AUTOINCREMENT накладывает дополнительные ресурсы процессора, памяти, дискового пространства и дискового ввода-вывода, и его следует избегать, если в этом нет особой необходимости.

Выбор за вами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...