2017-09-25 9 views
0

私はdbからデータを削除することに問題があります。 私は春のブートアプリケーションでHibernate ormを使用しています。今はdbからユーザーを削除したいときです。しかし、そこには実体があり、テーブルの中には、親テーブルのユーザーには外部キーが含まれているものがあります。どのように外部キーがどこにリンクされているすべてのデータを削除するには? ここに私のすべてのテーブルは、次のとおりとキーの列の名前:Java Springブート休止カスケードデータ

- User - id 
- Workers - id(fk) 
- Resetkeys - userId(fk) 
- UserRole - userId(fk) 
- Tokens - userId(fk) 

をそして、すべてこのデータをどのように削除ユーザー? 助けてくれてありがとう!

+0

を参照してください。どのようにマップしましたか? 'カスケード'ポリシーやその他のものは何ですか? –

答えて

0

削除操作の前後で外部キー制約を無効にして再度有効にすることはどうですか。

alter table Resetkeys nocheck constraint all 
delete from Resetkeys ... 
alter table Resetkeys check constraint all 
+0

いいえDELETEの操作はありますか? – johnson

+0

すべてのテーブルの名前を追加しました。なぜMyTableを使用しますか – johnson

+0

@johnsonテーブルでは、外部キー制約があるレコードは削除できません。私がしたこと: - 私はテーブル(Resetkeys)の制約のチェックを無効にして、再びレコードを削除した後、制約チェックを有効にしました。これはサンプルです。役立つと思われる場合は、すべてのテーブルでそれを実行できます。 –

0

編集

春やHibernateのようなフレームワークへの参照がなければ、あなたは単にとき、すべての関連レコードを削除するために、外部キー列上の制約を使用してデータベーステーブルを設定することができます「ユーザー」レコードが削除されます。制約はON DELETE CASCADEと呼ばれ、結合された表の外部キー列に定義すると、RDBMSは削除されたレコードの選択されたユーザーIDと外部キーが一致するすべてのレコードを自動的に削除します。

具体的には、使用しているデータベースサーバーの詳細については、ON DELETE CASCADE制約に関する調査をお試しください。

CREATE TABLE product (
    category INT NOT NULL, id INT NOT NULL, 
    price DECIMAL, 
    PRIMARY KEY(category, id) 
) ENGINE=INNODB; 

CREATE TABLE customer (
    id INT NOT NULL, 
    PRIMARY KEY (id) 
) ENGINE=INNODB; 

CREATE TABLE product_order (
    no INT NOT NULL AUTO_INCREMENT, 
    product_category INT NOT NULL, 
    product_id INT NOT NULL, 
    customer_id INT NOT NULL, 

    PRIMARY KEY(no), 
    INDEX (product_category, product_id), 
    INDEX (customer_id), 

    FOREIGN KEY (product_category, product_id) 
    REFERENCES product(category, id) 
    ON DELETE CASCADE, 

    FOREIGN KEY (customer_id) 
    REFERENCES customer(id) 
) ENGINE=INNODB; 

例はproductproduct_orderとの関係を示している:

編集#2)は ここMySQL documentationから修飾例です。 productテーブル(単に単にDELETE FROM product WHERE id=... and category=...を実行している)からレコードを削除すると、product_orderテーブル内のすべての参照レコードは、追加のSQL文なしで自動的に削除されます。 一方、customerテーブルから行を削除すると、デフォルトの制約でそのような場合にレコードの削除操作が制限されるため、今取得しているのと同じエラーが表示されます。

+0

答えをありがとう。上のコードで言及したデータ用のサンプルクエリを記述できますか?ありがとう! – johnson

0

モデルでリレーションアノテーションを使用しましたか?このよう 、

@OneToMany(カスケード= CascadeType.REMOVE

はあなたのエンティティの関係については何も言わなかったスペックhttps://docs.oracle.com/cd/E19798-01/821-1841/bnbqm/index.html

+0

私はcascade = CascadeType.ALLを使用しました。 – johnson

+0

私はそれをCascadeTypeに変更しました。削除しても機能しません。また、テーブルへの削除カスケードにも追加されます – johnson

関連する問題