Python MySQL: очистить таблицу с несколькими внешними ключами
-
06-07-2019 - |
Вопрос
Я работаю с Python MySQL, и мне нужно очистить таблицу в моей базе данных, которая содержит 13328 строк.
Я не могу сделать простую удаленную таблицу, потому что эта таблица является дочерней, а также отцом других дочерних внешних ключей, связанных с ней. Если я попробую сбросить таблицу, система запретит мне. Таблица определяется с помощью ON UPDATE CASCADE, ON DELETE CASCADE и InnoDB; Индекс primary_key для этой таблицы определяется как
productID INT(6) NOT NULL AUTO_INCREMENT ...
PRIMARY KEY (productID,productNO)
Поэтому мне просто нужно убрать; это автоматически восстановит индекс первичного ключа таблицы до 1 для следующего ввода. Правильно?
Эта процедура отлично работала для другой таблицы, которая была отцовским, но не для родительского и дочернего. Но для этой таблицы, которая является дочерью и отцом других таблиц, я застрял на ней.
Вот код - productID - мой основной индексный ключ к этой таблице:
def clean_tableProduct(self):
getMaxID_MySQLQuery = """SELECT MAX(productID)
FROM product;"""
cleanTabeMySQLQuery="""DELETE FROM product WHERE productID <=%s;"""
self.cursorMySQL.execute(getMaxID_MySQLQuery)
for row in self.cursorMySQL:
self.cursorMySQL.execute(cleanTabeMySQLQuery,(row[0],))
Если я захожу в консоль MySQL, чтобы проверить результаты обработки, я получаю:
mysql> SELECT MIN(productID)
FROM product;
4615748
mysql> SELECT MAX(productID)
FROM product;
4629075
Если я запускаю ту же команду в консоли для очистки таблицы, она работает:
mysql> DELETE FROM product WHERE productID <='4629075';
Query OK, 13328 rows affected (0.64 sec)
и показывает мне, чего я обычно ожидаю.
Однако, если я перехожу к функции Python после очистки таблицы на консоли и снова запускаю программу, а также очищаю таблицу, чтобы возобновить обработку, она перезапускает индекс таблицы не с MIN: 1, а вместо 4629076. р>
Есть предложения?
Все комментарии и предложения высоко ценятся и приветствуются.
Решение
Чтобы удалить все записи из таблицы:
truncate table product
Для сброса следующего идентификатора на 1:
ALTER TABLE product AUTO_INCREMENT = 1
или
SET insert_id;
INSERT INTO product ...;
(Я не проверял это. Но я должен работать)
Другие советы
Если вы чистите таблицу с помощью усечения:
TRUNCATE TABLE product
В качестве побочного эффекта сбрасывается счетчик автоприращения. Но вы также можете сбросить его вручную:
ALTER TABLE product AUTO_INCREMENT = 1
Большое спасибо за все отзывы и быструю обратную связь. Это добилось цели!
Вот как это выглядит сейчас:
def clean_tableProduct(self):
cleanTabeMySQLQuery = """TRUNCATE TABLE product;"""
self.cursorMySQL.execute(cleanTabeMySQLQuery)
setIndexMySQLQuery = """ALTER TABLE product AUTO_INCREMENT = 1;"""
self.cursorMySQL.execute(setIndexMySQLQuery)