Python MySQL: pulisce la tabella di più chiavi esterne
-
06-07-2019 - |
Domanda
Sto lavorando con Python MySQL e ho bisogno di pulire una tabella nel mio database che ha 13328 righe.
Non posso creare una semplice tabella a discesa, perché questa tabella è figlio e anche padre di altre chiavi esterne figlio collegate su di essa. Se provo a eliminare la tabella, il sistema mi ha proibito. La tabella è definita con ON UPDATE CASCADE, ON DELETE CASCADE e InnoDB; L'indice primary_key per quella tabella è definito come
productID INT(6) NOT NULL AUTO_INCREMENT ...
PRIMARY KEY (productID,productNO)
Pertanto, devo solo pulire; questo ripristinerà automaticamente l'indice della chiave primaria della tabella su 1 per l'input successivo. Giusto?
Questa procedura ha funzionato bene per un'altra tabella che era una tabella padre, ma non anche una tabella padre e figlio. Ma, per questo tavolo, che è figlio e padre di altri tavoli, mi sono bloccato su di esso.
Ecco il codice - productID è la mia chiave di indice principale per questa tabella:
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],))
Se vado alla console MySQL per controllare i risultati dell'elaborazione, mi viene visualizzato:
mysql> SELECT MIN(productID)
FROM product;
4615748
mysql> SELECT MAX(productID)
FROM product;
4629075
Se eseguo lo stesso comando sulla console per pulire la tabella, funziona:
mysql> DELETE FROM product WHERE productID <='4629075';
Query OK, 13328 rows affected (0.64 sec)
e mi mostra cosa mi aspetterei normalmente.
Tuttavia, se vado alla funzione Python dopo aver pulito la tabella sulla console ed eseguito nuovamente il programma e pulito la tabella per riavviare l'elaborazione, riavvia l'indice della tabella non con MIN: 1, ma invece 4629076.
Qualche suggerimento?
Tutti i commenti e i suggerimenti sono molto apprezzati e benvenuti.
Soluzione
Per rimuovere tutti i record dalla tabella:
truncate table product
Per reimpostare l'ID successivo su 1:
ALTER TABLE product AUTO_INCREMENT = 1
o
SET insert_id;
INSERT INTO product ...;
(Non l'ho provato. Ma dovrei funzionare)
Altri suggerimenti
Se si pulisce una tabella con troncato:
TRUNCATE TABLE product
Come effetto collaterale, questo ripristinerà il contatore dell'incremento automatico. Ma puoi anche ripristinarlo manualmente:
ALTER TABLE product AUTO_INCREMENT = 1
Grazie mille per tutti gli input e feedback rapidi. Ha fatto il trucco!
Ecco come appare ora:
def clean_tableProduct(self):
cleanTabeMySQLQuery = """TRUNCATE TABLE product;"""
self.cursorMySQL.execute(cleanTabeMySQLQuery)
setIndexMySQLQuery = """ALTER TABLE product AUTO_INCREMENT = 1;"""
self.cursorMySQL.execute(setIndexMySQLQuery)