Python MySQL:清理多个外键表

0 投票
3 回答
834 浏览
提问于 2025-04-15 16:28

我正在使用Python和MySQL,想要清理一个有13328行数据的数据库表。

我不能简单地删除这个表,因为它既是其他表的父表,也是子表,和其他表有外键关联。如果我尝试删除这个表,系统会不让我这么做。这个表的设置是ON UPDATE CASCADE和ON DELETE CASCADE,并且使用了InnoDB;这个表的主键索引定义如下:

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函数中再次运行程序,并清理表以重新开始处理,表的索引却不是从1开始,而是从4629076开始。

有什么建议吗?

非常欢迎和感谢所有的评论和建议。

3 个回答

0

非常感谢大家的建议和快速反馈。这真是帮了大忙!

现在它的样子是这样的:

def clean_tableProduct(self):
    cleanTabeMySQLQuery = """TRUNCATE TABLE product;"""
    self.cursorMySQL.execute(cleanTabeMySQLQuery)

    setIndexMySQLQuery = """ALTER TABLE product AUTO_INCREMENT = 1;"""
    self.cursorMySQL.execute(setIndexMySQLQuery)
2

如果你用truncate来清空一个表:

TRUNCATE TABLE product

那么作为一个副作用,它会把自动增长的计数器重置。不过你也可以手动重置它:

ALTER TABLE product AUTO_INCREMENT = 1
2

要从表格中删除所有记录:

truncate table product

要把下一个ID重置为1:

ALTER TABLE product AUTO_INCREMENT = 1

或者

SET insert_id;
INSERT INTO product ...;

(我还没有测试过这个,但应该可以用)

撰写回答