@Bergis

Как удалить все дубликаты в бд?

У меня есть база :
sql_average.execute("""CREATE TABLE IF NOT EXISTS prices_average (
    Сервер TEXT,
    Категория TEXT,
    Предмет TEXT,
    Цена  BIGINT,
    День BIGINT,
    Час BIGINT
)""")


Подскажите как можно удалить дубликаты из базы ,которые совпадают по всем значениям ?
  • Вопрос задан
  • 464 просмотра
Решения вопроса 1
hottabxp
@hottabxp
Сначала мы жили бедно, а потом нас обокрали..
Очень просто. Создаем в этой базе еще одну таблицу с именем prices_average2(например).
Далее из базы prices_average выбираем все строки. После выборки, у нас будет список кортежей(rows). Создаем пустой список. В цикле пробегаемся по элементам списка. При каждой итерации проверяем, есть ли текущий элемент в списке, если да - то ничего не делаем, если нет, заносим текущий элемент (кортеж) в новую таблицу prices_average2 и добавляем в список. Если бы в базе был уникальный столбец, можно было бы обойтись без второй таблицы(хотя может и сейчас так можно - мне просто лень ночью мозги напрягать:))
Я конечно не эксперт по БД, но что-то мне подсказывает, что если в базе нет уникального столбца(забыл как называется) - это может доставить некоторых проблем.
import sqlite3

conn = sqlite3.connect('1.db')
cursor = conn.cursor()

cursor.execute("""CREATE TABLE IF NOT EXISTS prices_average2 (
    Сервер TEXT,
    Категория TEXT,
    Предмет TEXT,
    Цена  BIGINT,
    День BIGINT,
    Час BIGINT
)""")

cursor.execute('SELECT * FROM prices_average')
rows = cursor.fetchall()

unique_list = []

for row in rows:
	if row in unique_list:
		pass
	else:
		cursor.execute('INSERT INTO prices_average2 VALUES(?,?,?,?,?,?)',row)
		unique_list.append(row)

conn.commit()
conn.close()

Перед экспериментом сделайте резервную копию.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@xibolba
Вот вариант без создание таблиц, если 1ый аргумент уникальный id.
db = sqlite3.connect('data_base')
cursor =  db.execute('SELECT * FROM prices_average')
rows = cursor.fetchall()
unique_list = []

for row in rows:
    if row[1:] not in [i[1:] for i in unique_list]:
        unique_list.append(row)
    else:
        db.execute(f"""
            DELETE FROM prices_average
            WHERE id={row[0]}
        """)
db.commit()
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы