0

我正在使用 Python MySQL,需要清理数据库中包含 13328 行的表。

我不能制作一个简单的删除表,因为这个表是孩子,也是其他孩子外键的父亲。如果我尝试 drop table,系统会禁止我。该表使用 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 函数,然后再次运行程序,并清理表以重新开始处理,它会重新启动表索引,而不是 MIN:1,而是 4629076。

有什么建议吗?

所有意见和建议都受到高度赞赏和欢迎。

4

3 回答 3

2

要从表中删除所有记录:

truncate table product

要将下一个 ID 重置为 1:

ALTER TABLE product AUTO_INCREMENT = 1

或者

SET insert_id;
INSERT INTO product ...;

(我没有测试过这个。但我应该工作)

于 2009-11-28T11:39:23.167 回答
2

如果您使用 truncate 清理表:

TRUNCATE TABLE product

作为副作用,这将重置自动增量计数器。但您也可以手动重置它:

ALTER TABLE product AUTO_INCREMENT = 1
于 2009-11-28T11:41:37.653 回答
0

非常感谢所有输入和快速反馈。它成功了!

这是它现在的样子:

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

    setIndexMySQLQuery = """ALTER TABLE product AUTO_INCREMENT = 1;"""
    self.cursorMySQL.execute(setIndexMySQLQuery)
于 2009-11-30T00:00:23.573 回答