Python MySQL:複数の外部キーテーブルを消去します
-
06-07-2019 - |
質問
Python MySQLを使用していますが、データベース内で13328行のテーブルを削除する必要があります。
このテーブルは子であり、リンクされている他の子外部キーの父親でもあるため、単純なドロップテーブルを作成することはできません。テーブルをドロップしようとすると、システムは私を禁止しました。テーブルは、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.
提案はありますか?
すべてのコメントと提案を歓迎します。
解決
テーブルからすべてのレコードを削除するには:
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)