2016-06-13 3 views
-4

Я создаю сайт python/flask, и он работает до сих пор, но поскольку мне действительно нужно/использовать счетчик (id) (где id - это автоматический прирост первичного key), я не могу просто удалить некоторые строки случайным образом.python SQLite3 обновить идентификатор строки при удалении одной строки

Кто-нибудь знает, как лучше всего обновлять все другие более высокие идентификаторы при удалении одной строки, вроде списка, поэтому count() и id совпадают. (первый ID = 1, поэтому он должен идеально соответствовать без обновления).

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

+0

'Количество (ID)' не зависит от разрывов в последовательности. Как вы думаете, в чем проблема, не обновляя более высокие идентификаторы? –

+0

Связанный: http://stackoverflow.com/questions/14023292/how-to-get-rownum-like-column-in-sqlite-iphone/19199219#19199219 –

+0

Моя проблема заключается именно в том, что count (id) не является затрагивается идентификатором строки. Это нормально, потому что это я хочу, но я хотел знать, как обновлять все более высокие идентификационные вхождения в таблице, поэтому идентификаторы будут равны счетчику (без идентификатора нет), а затем обновляют последовательность таблиц. – Artemis

ответ

0

Одним из способов воссоздания последовательной нумерации ключа является удаление таблицы и ее восстановление. Рассмотрим функцию renumber() в коде ниже:

import sqlite3 
from pprint import pprint 

schema = ''' 
    create table S (
     id integer primary key autoincrement not null, 
     content text not null)''' 
def init(db): 
    db.execute('drop table if exists S') 
    db.execute(schema) 
    db.execute('insert into S (content) VALUES ("one")') 
    db.execute('insert into S (content) VALUES ("two")') 
    db.execute('insert into S (content) VALUES ("three")') 
    db.execute('insert into S (content) VALUES ("four")') 
    db.commit() 

def dump(db): 
    for row in db.execute('select * from S order by ID'): 
     print row 
    print 

def renumber(db): 
    # To reorganize the primary key, create a new table 
    db.execute('create temp table temp_S as select content from S order by id') 
    db.execute('drop table S') 
    db.execute(schema) 
    db.execute('insert into S (content) ' 
       ' select content from temp_S order by rowid') 
    db.commit() 


db = sqlite3.connect(':memory:') 
init(db) 
dump(db) 
db.execute('delete from S where id in (1,3)') 
db.commit() 
dump(db) 
renumber(db) 
dump(db) 

Результат:

(1, u'one') 
(2, u'two') 
(3, u'three') 
(4, u'four') 

(2, u'two') 
(4, u'four') 

(1, u'two') 
(2, u'four') 
Смежные вопросы