こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

複数のテーブルのレコードを DELETEする方法 ( 外部参照 テーブル )

バージョンは、8.1.5 です。

下記のように外部参照された 2つのテーブルがあります。
userテーブル
 --------------------
 userid   | integer
 passwd  | text
 --------------------
user_rel_groupテーブル
 ---------------------
 userid  | integer
 gatid   | integer
 ---------------------
Foreign-key constraints:
"user_rel_group_userid_fkey" FOREIGN KEY (userid) REFERENCES user(userid)

そこで、
userテーブルからユーザーを削除した場合、
=> DELETE from user where userid = 10030118;
ERROR: update or delete on "user" violates foreign key constraint "user_rel_group_userid_fkey" on "user_rel_group"
DETAIL: Key (userid)=(10030118) is still referenced from table "user_rel_group".

とエラーがでますが、【 MySQL 】ではDELETE文にて、
DELETE member, user_rel_group FROM user LEFT JOIN user.userid = user_rel_group.userid WHERE userid = 10030118;

のようにテーブルを結合して、複数のテーブルのレコードを削除できるようですが、
PostgreSQLは、出来ますでしょうか?

また、
テーブル作成時に、
CREATE TABLE user_rel_group (
  userid integer,
....
  constraint group_user_foreignkey
  foreign key(userid) references user(userid) on delete cascade
);
と、制約が必須だったのでしょうか?

どなたかご教授お願い致します。

投稿日時 - 2009-09-21 14:57:31

QNo.5307437

困ってます

質問者が選んだベストアンサー

すでに回答が付いていますが、 PostgreSQLでは、テーブルを結合して削除することは出来なかったと思います。

対策としては、下記の方法が考えられるかと。

1. 削除時には、先に user_rel_group テーブルの該当レコードを消してから member テーブルのレコードを消す様にする。
例) ---------------------------------------------------
DELETE user_rel_group WHERE userid = 10030118;
DELETE member WHERE userid = 10030118;
-------------------------------------------------------

2. ALTER TABLE 文で参照整合性制約を付け直す。
-------------------------------------------------------
ALTER TABLE user_rel_group DROP CONSTRAINT user_rel_group_userid_fkey;
ALTER TABLE user_rel_group ADD CONSTRAINT user_rel_group_userid_fkey FOREIGN KEY (userid) REFERENCES user (userid) ON DELETE CASCADE;
-------------------------------------------------------

参考URL:http://www.postgresql.jp/document/pg815doc/html/sql-altertable.html

投稿日時 - 2009-09-24 01:35:07

お礼

回答有難うございます。

「ALTER TABLE 文で参照整合性制約を付け直す。」の例、参考になりました。
テーブルのつくり直ししてしまいました。。

投稿日時 - 2009-09-24 15:30:22

ANo.2

このQ&Aは役に立ちましたか?

3人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

> のようにテーブルを結合して、複数のテーブルのレコードを削除できるようですが、
> PostgreSQLは、出来ますでしょうか?

確かできなかったと思います。
http://www.postgresql.jp/document/current/html/sql-delete.html

投稿日時 - 2009-09-22 03:41:39

お礼

返信送れて、申し訳ありません。

やっぱり出来ないみたいですか。

投稿日時 - 2009-09-24 15:26:23

あなたにオススメの質問