Python MySQL:清理多个外键表
我正在使用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 ...;
(我还没有测试过这个,但应该可以用)