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

我不能创建一个简单的drop table,因为这个表是child,也是链接在其上的其他子外键的父亲。如果我尝试丢桌,系统禁止我。该表使用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。 / p>

有什么建议吗?

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

有帮助吗?

解决方案

删除表格中的所有记录:

truncate table product

将下一个ID重置为1:

ALTER TABLE product AUTO_INCREMENT = 1

SET insert_id;
INSERT INTO product ...;

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

其他提示

如果使用truncate清理表:

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)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top