web-dev-qa-db-ja.com

外部キー制約テーブルを切り捨てる方法

mygroupTRUNCATEが機能しないのはなぜですか?私はON DELETE CASCADE SETを持っていますが

エラー1701(42000):外部キー制約(mytest.instance、CONSTRAINT instance_ibfk_1 FOREIGN KEY(GroupID))で参照されているテーブルを切り捨てることができません参照_ mytest.mygroupID))

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;
565
user391986

FK制約が適用されているテーブルをTRUNCATEすることはできません(TRUNCATEDELETEと同じではありません)。

これを回避するために、これらのソリューションのいずれかを使用してください。どちらもデータの整合性を損なう危険性があります。

オプション1:

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

オプション2:によって提案された user447951- 彼らの答え

SET FOREIGN_KEY_CHECKS = 0; 
TRUNCATE table $table_name; 
SET FOREIGN_KEY_CHECKS = 1;
826
zerkms

はい、できます:

SET FOREIGN_KEY_CHECKS = 0;

TRUNCATE table1;
TRUNCATE table2;

SET FOREIGN_KEY_CHECKS = 1;

これらのステートメントを使用すると、FOREIGN KEY制約に準拠していない行をテーブルに入れることができます。

1195
user447951

私は単純にそれをするでしょう:

DELETE FROM mytest.instance;
ALTER TABLE mytest.instance AUTO_INCREMENT = 1;

できるよ

DELETE FROM `mytable` WHERE `id` > 0
12
Ali Sadran

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

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

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

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

11
Omer Sabic

この質問は5年以上前に聞かれましたが、当時はこの機能がMySqlに存在していたわけではありませんが、今度は phpmyadmin を使用すればデータベースを開いてテーブルを選択できます。切り捨てます。一番下には、リストされた多くのオプションを含むドロップダウンがあります。それを開き、見出し - データまたはテーブルの削除 の下の 空白 オプションを選択します。チェックボックスに外部キーチェックを有効にするというオプションがある場合は自動的に次のページに進みます。選択を解除して[はい]ボタンを押すと、選択したテーブルが切り捨てられます。 user447951の回答で提案されているクエリが内部的に実行される可能性があります。しかし、phpmyadminインターフェースから使うのはとても便利です。

6
Rolen Koh

答えは確かに zerkms で与えられるものです。 オプション1

オプション1 :データの完全性を損なう恐れはありません。

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

ややこしい部分は 制約の削除 なので、誰かがその方法を知っておく必要がある場合に備えて、どのようにしたらよいかを説明します。

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

    enter image description here

  2. ALTER TABLE <Table Name> DROP FOREIGN KEY <Foreign Key Name>を実行してください。これにより外部キー制約が取り除かれます。

  3. 関連付けられた Index を(テーブル構造ページを介して)ドロップすれば完了です。

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

ALTER TABLE <Table Name>
ADD FOREIGN KEY (<Field Name>) REFERENCES <Foreign Table Name>(<Field Name>);
3
Pmpr

PhpMyAdminを使っているなら簡単です。

SQLタブの下のEnable foreign key checksオプションをオフにしてTRUNCATE <TABLE_NAME>を実行するだけです。

enter image description here

2
Ajmal Salim

CASCADEを使うだけ

TRUNCATE "products" RESTART IDENTITY CASCADE;

しかし、カスケード削除の準備ができている)

1
Alexus1024

テーブルのデータベースエンジンが異なる場合はこのエラーが発生しますので、InnoDBに変更してください。

ALTER TABLE my_table ENGINE = InnoDB;
0
sajad abbasi

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;
0
Vijay Arun