767

TRUNCATEが機能しないのはなぜmygroupですか? 私が持っているにもかかわらず、私はON DELETE CASCADE SET得る:

エラー 1701 (42000): 外部キー制約で参照されているテーブルを切り捨てることはできません ( mytest. instance, CONSTRAINT instance_ibfk_1FOREIGN KEY ( GroupID) REFERENCES 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;
4

14 に答える 14

1453

はい、できます:

SET FOREIGN_KEY_CHECKS = 0;

TRUNCATE table1;
TRUNCATE table2;

SET FOREIGN_KEY_CHECKS = 1;

FOREIGN KEYこれらのステートメントを使用すると、制約に従わない行をテーブルに入れる危険があります。

于 2011-11-10T03:02:02.440 に答える
1174

TRUNCATEFK 制約が適用されているテーブルは使用できません(TRUNCATEは と同じではありませんDELETE)。

これを回避するには、これらのソリューションのいずれかを使用します。どちらも、データの整合性を損なうリスクがあります。

オプション1:

  1. 制約を削除
  2. 実行TRUNCATE
  3. どこにも参照されていない行を手動で削除します
  4. 拘束を作成する

オプション 2: 回答でuser447951提案

SET FOREIGN_KEY_CHECKS = 0; 
TRUNCATE table $table_name; 
SET FOREIGN_KEY_CHECKS = 1;
于 2011-03-27T22:03:44.433 に答える
211

私は単にそれを行うだろう:

DELETE FROM mytest.instance;
ALTER TABLE mytest.instance AUTO_INCREMENT = 1;
于 2014-09-24T11:05:49.270 に答える
23

できるよ

DELETE FROM `mytable` WHERE `id` > 0
于 2017-05-13T13:20:27.470 に答える
15

MYSQL データベースでテスト済み

解決策 1:

SET FOREIGN_KEY_CHECKS = 0;
TRUNCATE table1;

解決策 2:

DELETE FROM table1;
ALTER TABLE table1 AUTO_INCREMENT = 1;
TRUNCATE table1;

これは私にとってはうまくいきます。これがあなたにも役立つことを願っています。この質問をしてくれてありがとう。

于 2019-11-13T11:37:27.483 に答える
14

mysql のドキュメントによると、TRUNCATE は外部キー関係を持つテーブルでは使用できません。私の知る限り、完全な代替手段はありません。

制約を削除しても、ON DELETE と ON UPDATE は呼び出されません。ATM で考えられる唯一の解決策は、次のいずれかです。

  • すべての行を削除し、外部キーを削除し、切り捨て、キーを再作成します
  • すべての行を削除し、auto_increment をリセットします (使用されている場合)

MySQL の TRUNCATE はまだ完全な機能ではないようです (トリガーも呼び出しません)。 コメントを見る

于 2012-10-16T09:20:36.157 に答える
8

この質問がされている間、私はそれについて知りませんでしたが、phpMyAdmin を使用すると、データベースを開いて、切り捨てたいテーブルを選択するだけで済みます。

  • 下部には、多くのオプションを含むドロップダウンがあります。Emptyそれを開き、見出しの下のオプションを選択しますDelete data or table
  • と呼ばれるチェックボックスにオプションがある次のページに自動的に移動しますEnable foreign key checks。選択を解除してYesボタンを押すだけで、選択したテーブルが切り捨てられます。

user447951's answerで提案されているクエリを内部的に実行するかもしれませんが、phpMyAdmin インターフェイスから使用すると非常に便利です。

于 2016-12-22T11:41:54.570 に答える
6

オプション 1で述べたように、答えは確かにzerkmsによって提供されたものです。

オプション 1 : データの整合性を損なうリスクがない:

  1. 制約を削除
  2. TRUNCATE を実行する
  3. どこにも参照されていない行を手動で削除します
  4. 拘束を作成する

トリッキーな部分は制約の削除 であるため、誰かがその方法を知る必要がある場合に備えて、その方法を説明したいと思います:

  1. SHOW CREATE TABLE <Table Name>クエリを実行して、 FOREIGN KEYの名前を確認します (下の画像の赤枠):

    ここに画像の説明を入力

  2. 実行しますALTER TABLE <Table Name> DROP FOREIGN KEY <Foreign Key Name>。これにより、外部キー制約が削除されます。

  3. 関連するインデックスを (テーブル構造ページから)ドロップすれば完了です。

外部キーを再作成するには:

ALTER TABLE <Table Name>
ADD FOREIGN KEY (<Field Name>) REFERENCES <Foreign Table Name>(<Field Name>);
于 2016-11-24T19:15:15.847 に答える
0

テーブルのデータベース エンジンが異なる場合、このエラーが発生するため、それらを InnoDB に変更します。

ALTER TABLE my_table ENGINE = InnoDB;
于 2018-08-20T21:14:36.397 に答える