Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 18, 2016 17:45:27

XoFfiCEr
От:
Зарегистрирован: 2011-06-05
Сообщения: 50
Репутация: +  1  -
Профиль   Отправить e-mail  

sqlite3 восстановить нумерацию primary key после удаления записей.

sqlite3
Первое поле Primary Key естественно оно уникальное и повторяться не должно.
После удаления записи нумерация сбивается и это вызывало ошибки в программе.
Как восстановить очередность primary key?
Я конечно сделал но по своему (в два прохода update), не оптимально а говнокодить то не хочется.
Поэтому спрашиваю как лучше сделать?.



Офлайн

#2 Сен. 18, 2016 17:50:55

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

sqlite3 восстановить нумерацию primary key после удаления записей.

Могу предположить что такие поля должны быть авто инкрементируемыми, наподобие того как устроен дефолтное id поле. Таким образом за счет средств самой БД оно будет всегда уникальным при создании новой записи.
Т.е. имеет место не правильное построение архитектуры программы и БД



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#3 Сен. 21, 2016 21:16:06

XoFfiCEr
От:
Зарегистрирован: 2011-06-05
Сообщения: 50
Репутация: +  1  -
Профиль   Отправить e-mail  

sqlite3 восстановить нумерацию primary key после удаления записей.

Вот тут я вас не понял JOHN_16 при добавлении новых записей действительно primary key автоинкрементируется а вот при удалении записей последовательная нумерация не восстанавливается. А что должна?



Офлайн

#4 Сен. 21, 2016 23:41:47

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

sqlite3 восстановить нумерацию primary key после удаления записей.

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

Офлайн

#5 Сен. 22, 2016 11:54:30

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

sqlite3 восстановить нумерацию primary key после удаления записей.

XoFfiCEr
нет и не должна восстанавливаться.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#6 Сен. 22, 2016 12:19:30

ilnur
От: Казань
Зарегистрирован: 2009-01-06
Сообщения: 524
Репутация: +  22  -
Профиль   Отправить e-mail  

sqlite3 восстановить нумерацию primary key после удаления записей.

sqlite делает +1 для новой записи, а вот постгрес например ведет счетчик.
в разных субд по разному

Офлайн

#7 Сен. 25, 2016 14:17:34

XoFfiCEr
От:
Зарегистрирован: 2011-06-05
Сообщения: 50
Репутация: +  1  -
Профиль   Отправить e-mail  

sqlite3 восстановить нумерацию primary key после удаления записей.

Спасибо всем ответившим в этой теме.
Вот простая функция удаления записи из таблицы БД.
Вроде все ок…

 def tab5_kill():                            # процедура удаления кривой пути по идентификатору
    global tab5_editmode                    # глобальные переменные
    conn=sqlite3.connect(src_file)          # подключение
    curs=conn.cursor()                      # готовимся к удалению
    curs.execute('delete from curves where id = ?', [tab5_id])  # непосредственно удаление
    conn.commit()                           # подтверждаем
    curs.close()                            # закрываем
    conn.close()                            # закрываем нах
    tab5_correct_id()                       # коррекция идентификаторов кривых
    sfile=src_file[ld:]                     # файл БД с которым мы работаем
    logtext='удалена кривая пути, база данных '+sfile # сообщение для log файла
    save_text_to_log_file(logtext)          # записываем в log файл
    tab5_clear_text_fields()                # очищаем поля ввода ибо нефиг
    tab5_editor_direction.config(text=xs[0])# возвращаем дефолтное направление кривой
    tab5_editmode=False                     # переход в режим добавления
    tab5_after_update()                     # обновление информации о кривых
    tabmode5_view()                         # переход на обработку tab5 notebook
    #tab5_service_message(2)                # сообщение о выполнении



Офлайн

#8 Сен. 26, 2016 16:58:06

VadimK
Зарегистрирован: 2013-07-03
Сообщения: 199
Репутация: +  16  -
Профиль   Отправить e-mail  

sqlite3 восстановить нумерацию primary key после удаления записей.

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

Офлайн

#9 Сен. 26, 2016 20:17:47

XoFfiCEr
От:
Зарегистрирован: 2011-06-05
Сообщения: 50
Репутация: +  1  -
Профиль   Отправить e-mail  

sqlite3 восстановить нумерацию primary key после удаления записей.

VadimK они у меня вроде никак не связаны.

Всем, нужна помощь в оптимизации этой процедуры

 def tab5_correct_id():           # коррекция идентификаторов по tab5 (кривые пути)
    read_database_file()                               # перечитываем базу данных
    c=0                                                           # это счетчик корректирвоок
    random.seed(594999)                             # это говнокод конечно еще и какой
    pw=random.randint(3, 7)                        # но хоть работает беспроблемно
    dv=pow(10, pw)                                      # коэфициент
    conn=sqlite3.connect(src_file)               # подключаем БД
    curs=conn.cursor()                               # курсор
    i=0                                                          # обнуляем счетчик
    while i<crv_count:                                 # цикл
        si=i+1                                                # на единицу больше чем счетчик
        si*=dv                                               # умножаем на множитель во избежание неуникальных ключей
        t=cdata[i][0]                                      # текущее значение
        curs.execute('update curves set id=? where id=?', [si, t])     # обновление
        c=c+curs.rowcount                       # количество записей затронутых обновлением
        conn.commit()                              # выполняем
        i+=1                                              # инкрементируем
    i=0                                                    # обнуляем счетчик
    while i<crv_count:                           # цикл опять прогон по всем кривым
        si=i+1                                         # инкрементируем ибо начинается не с нуля вообще то
        sd=si*dv                                     # умножаекм на множитель
        curs.execute('update curves set id=? where id=?', [si, sd])    # обновление
        c=c+curs.rowcount                   # количество обновленных
        conn.commit()                       # подтврждаем выполнение
        i+=1                                # инкрементируем счетчик
    curs.close()                            # закрываем курсор
    conn.close()                            # закрываем sqlite подключение
    #print ('выполнено корректировок: ', c) # отладочная информация
Не хочется это сдавать заказчику.



Отредактировано XoFfiCEr (Сен. 26, 2016 20:28:40)

Офлайн

#10 Сен. 27, 2016 05:12:42

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

sqlite3 восстановить нумерацию primary key после удаления записей.

Ух, мосье знает толк в извращениях! Зачем вам вообще СУБД при таком подходе? Конкурентного доступа нет, связей нет, данных не вагон(если смело таблицу целиком перелопачиваете ), не проще засунуть все в список и пиклить его в файл?



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version