mygroup
でTRUNCATEが機能しないのはなぜですか?私はON DELETE CASCADE SET
を持っていますが
エラー1701(42000):外部キー制約(
mytest
.instance
、CONSTRAINTinstance_ibfk_1
FOREIGN KEY(GroupID
))で参照されているテーブルを切り捨てることができません参照_mytest
.mygroup
(ID
))
drop database mytest;
create database mytest;
use mytest;
CREATE TABLE mygroup (
ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY
) ENGINE=InnoDB;
CREATE TABLE instance (
ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
GroupID INT NOT NULL,
DateTime DATETIME DEFAULT NULL,
FOREIGN KEY (GroupID) REFERENCES mygroup(ID) ON DELETE CASCADE,
UNIQUE(GroupID)
) ENGINE=InnoDB;
FK制約が適用されているテーブルをTRUNCATE
することはできません(TRUNCATE
はDELETE
と同じではありません)。
これを回避するために、これらのソリューションのいずれかを使用してください。どちらもデータの整合性を損なう危険性があります。
オプション1:
TRUNCATE
を実行するオプション2:によって提案された user447951- 彼らの答え
SET FOREIGN_KEY_CHECKS = 0;
TRUNCATE table $table_name;
SET FOREIGN_KEY_CHECKS = 1;
はい、できます:
SET FOREIGN_KEY_CHECKS = 0;
TRUNCATE table1;
TRUNCATE table2;
SET FOREIGN_KEY_CHECKS = 1;
これらのステートメントを使用すると、FOREIGN KEY
制約に準拠していない行をテーブルに入れることができます。
私は単純にそれをするでしょう:
DELETE FROM mytest.instance;
ALTER TABLE mytest.instance AUTO_INCREMENT = 1;
できるよ
DELETE FROM `mytable` WHERE `id` > 0
mysqlのドキュメント に従って、TRUNCATEは外部キー関係を持つテーブルでは使用できません。完全な代替手段はありません。
制約を削除しても、ON DELETEおよびON UPDATEは呼び出されません。 ATMが考えられる唯一の解決策は、次のいずれかです。
MySQLのTRUNCATEはまだ完全な機能ではないようです(トリガも起動しません)。 コメントを見る
この質問は5年以上前に聞かれましたが、当時はこの機能がMySqlに存在していたわけではありませんが、今度は phpmyadmin を使用すればデータベースを開いてテーブルを選択できます。切り捨てます。一番下には、リストされた多くのオプションを含むドロップダウンがあります。それを開き、見出し - データまたはテーブルの削除 の下の 空白 オプションを選択します。チェックボックスに外部キーチェックを有効にするというオプションがある場合は自動的に次のページに進みます。選択を解除して[はい]ボタンを押すと、選択したテーブルが切り捨てられます。 user447951の回答で提案されているクエリが内部的に実行される可能性があります。しかし、phpmyadminインターフェースから使うのはとても便利です。
答えは確かに zerkms で与えられるものです。 オプション1 :
オプション1 :データの完全性を損なう恐れはありません。
- 制約を削除します
- TRUNCATEを実行する
- どこも参照していない行を手動で削除します。
- 制約を作成する
ややこしい部分は 制約の削除 なので、誰かがその方法を知っておく必要がある場合に備えて、どのようにしたらよいかを説明します。
SHOW CREATE TABLE <Table Name>
クエリを実行して、自分の FOREIGN KEY の名前を確認します(下の画像の赤い枠)。
ALTER TABLE <Table Name> DROP FOREIGN KEY <Foreign Key Name>
を実行してください。これにより外部キー制約が取り除かれます。
関連付けられた Index を(テーブル構造ページを介して)ドロップすれば完了です。
外部キーを再作成するには
ALTER TABLE <Table Name>
ADD FOREIGN KEY (<Field Name>) REFERENCES <Foreign Table Name>(<Field Name>);
CASCADEを使うだけ
TRUNCATE "products" RESTART IDENTITY CASCADE;
しかし、カスケード削除の準備ができている)
テーブルのデータベースエンジンが異なる場合はこのエラーが発生しますので、InnoDBに変更してください。
ALTER TABLE my_table ENGINE = InnoDB;
Mysql Workbenchがモデルをデータベースに同期させている間に古い外部キーチェック状態とSQLモードを取得することはテーブルを切り捨てる/ドロップするための最良の方法です。
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;`
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';
DROP TABLE TABLE_NAME;
TRUNCATE TABLE_NAME;
SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;