複数のテーブルのレコードをDELETEする方法
- 複数のテーブルからレコードを削除する方法について説明します。
- MySQLではテーブルの結合を利用してDELETE文で複数のテーブルのレコードを削除できますが、PostgreSQLではどうでしょうか?
- また、テーブル作成時に制約を設定する方法についても解説します。
- ベストアンサー
複数のテーブルのレコードを 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 ); と、制約が必須だったのでしょうか? どなたかご教授お願い致します。
- brosis
- お礼率94% (100/106)
- PostgreSQL
- 回答数2
- ありがとう数5
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
すでに回答が付いていますが、 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; -------------------------------------------------------
その他の回答 (1)
- nora1962
- ベストアンサー率60% (431/717)
> のようにテーブルを結合して、複数のテーブルのレコードを削除できるようですが、 > PostgreSQLは、出来ますでしょうか? 確かできなかったと思います。 http://www.postgresql.jp/document/current/html/sql-delete.html
お礼
返信送れて、申し訳ありません。 やっぱり出来ないみたいですか。
関連するQ&A
- 外部キーが設定されているテーブルのupdateについて
PostgreSQL8.24を利用しています。 pgADMINIIIでテーブルを作成しました。 【TABLE_A】と【TABLE_B】があります。 【TABLE_A】の【ID】が【TABLE_B】の【ID2】が外部キーとして設定してあります。 CONSTRAINT TABLE_B_fkey FOREIGN KEY (ID2) REFERENCES TABLE_A (ID) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION 上記のように記述されています。 SQL文のUPDATEを使い、IDが「01」を「05」に更新したいのですが、 以下のように記述するとエラーになります。 どのようなUPDATE文を記述すればよろしいのでしょうか。 UPDATE TABLE_A INNER JOIN TABLE_B on TABLE_A.ID=TABLE_B.ID2 SET TABLE_A.ID = '05',TABLE_B.ID2 = '05' WHERE TABLE_A.ID='01'" よろしくお願いいたします。
- ベストアンサー
- PostgreSQL
- テーブル作成 外部参照 配列
はじめまして maruchanといいます。 外部参照のところで詰まっています。 例: テーブルA id primary key name text と言うテーブルがあるとして CREATE TABLE B ( id PRIMARY KEY, z_id integer[] constraint constname references A(id) ); ということを実行したいんですが エラーが出ます。 ERROR: syntax error at or near "cast" at character 98 なにか気づく点がありましたら 返事ください。 宜しくお願いします。
- ベストアンサー
- PostgreSQL
- 主キーレコードを削除する場合
userテーブルのu_idを主キーとしており、 他でもu_idを主キーとしてあるテーブルがあります。 delete from user where u_id = 2 で、u_id = 2 のレコードを削除させようとしたのですが、 Cannot delete or update a parent row: a foreign key constraint fails (`aaaaa`.`message`, CONSTRAINT `message_ibfk_2` FOREIGN KEY (`m_guid`) REFERENCES `user` (`u_id`) ON UPDATE CASCADE) のようなエラーがでます。 どのような意味でしょうか?また、これを改善するには設定、sql文はどのようにしたらよいでしょうか? ご回答お願いいたします。
- 締切済み
- MySQL
- 外部キーを持つテーブルを作成しようとするとエラーがでます
XAMPPバージョン1.5.4 MySQLバージョン4.1.16 という環境で、my.cnfでInnoDBを使えるように設定しています。 そして CREATE TABLE admin_roles (id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, name VARCHAR(12) NOT NULL) ENGINE = InnoDB; という非参照列idを持つadmin_rolesテーブルを作り(成功し)、さらに role_idを外部キーとしてadmin_user_roleテーブルを作成しようとすると、 Error Number: 1005 Can't create table '.\test\admin_user_role.frm' (errno: 150) CREATE TABLE admin_user_role (userid VARCHAR(12) NOT NULL, role_id BIGINT DEFAULT 0, FOREIGN KEY (role_id) REFERENCES admin_roles(id) ON DELETE CASCADE) ENGINE = InnoDB; というエラーが出てしまいます・・・ admin_user_roleの記述のどこが間違っているのでしょうか?
- ベストアンサー
- MySQL
- 挿入ができない
MySQLバージョン4.1.16を使用しています。 「user_role」テーブルを 「users」テーブルのuser_idカラムと「roles」テーブルのrole_seqカラムを外部キーとして作成します。 そして「user_role」テーブルにuser_id「aaaa」とrole_seq「1」をINSERTしようとしたのですが、 以下のようなエラーが出てしまいます。 Cannot add or update a child row: a foreign key constraint fails (`test/user_role`, CONSTRAINT `user_role_ibfk_2` FOREIGN KEY (`user_id`) REFERENCES `users` (`user_id`) ON DELETE CASCADE) INSERT INTO user_role (user_id, role_seq) VALUES ('aaaa', 1) どこらへんが間違っているのでしょうか? 以下の手順でテーブルを作成しました。 CREATE TABLE users (user_id VARCHAR(16) NOT NULL, password VARCHAR(32) NOT NULL, regist_date DATETIME NOT NULL, PRIMARY KEY (user_id)) ENGINE = InnoDB CREATE TABLE roles (role_seq BIGINT UNSIGNED AUTO_INCREMENT, name VARCHAR(32) NOT NULL, PRIMARY KEY (role_seq)) ENGINE = InnoDB CREATE TABLE user_role (role_seq BIGINT UNSIGNED, user_id VARCHAR(16) NOT NULL, FOREIGN KEY (role_seq) REFERENCES roles(role_seq) ON DELETE CASCADE, FOREIGN KEY (user_id) REFERENCES users(user_id) ON DELETE CASCADE) ENGINE = InnoDB
- ベストアンサー
- MySQL
- すべてのテーブルのすべてのレコードを削除する方法
データベースを扱うプログラムに対してユニットテストを行いたいと思っています。 それぞれのテストが終了するごとにすべてのテーブル内のすべてのレコードを削除したいのですが、 delete from table_a; delete from table_b; delete from table_c; ... のように書くと、外部キー制約に引っかかってしまい削除できないことがあります。 短いSQL文で複数のテーブル内のレコードをすべて削除する方法はないのでしょうか? よろしくお願いします。 ちなみに、私が現在使っているDBMSはPostgreSQL 8.1です。
- ベストアンサー
- その他(データベース)
- 複数のテーブルにまたがるDELETE
カラム構成が同じのtable_Aとtable_Bがあります。 DELETE FROM table_A,table_B WHERE Column_1='you' AND Column_2='his' ORDER BY datetime LIMIT count といった具合に、 table_Aとtable_Bにまたがってdatetimeカラムが小さい順にcountの数だけ削除しようとしていますが、上記のSQL文ではエラーが出てしまいます。 誤りをご指摘願えればと存じます。よろしくお願いいたします。 versionはMySQL - 5.0.24-community-ntです。
- 締切済み
- MySQL
- ForeignKeyの作成方法について
MySQLでForeign Keyを作成しようと、以下のSQLを実行したところ、 テーブルは作成されず、エラーが発生しました。 エラーメッセージは Can't create table 'test.user' (errno: 150) です。 また、 INDEX (CompanyID), FOREIGN KEY (CompanyID) REFERENCES m_Company(CompanyID), の2行を外すと通常通りテーブルは作成できます。 どうやったら、Foreign Keyを設定できるでしょうか。 テーブル作成後に、後付でForeign Keyを設定しようと心みましたが、 それも失敗しました。 -------------------------------------------------------- CREATE TABLE user ( `Seqno` int(11) NOT NULL AUTO_INCREMENT, `UserID` varchar(8) NOT NULL DEFAULT '', `Password` varchar(8) DEFAULT NULL, `Mail` varchar(100) DEFAULT NULL, `Valid` tinyint(4) DEFAULT NULL, `CompanyID` int(11) DEFAULT NULL, INDEX (CompanyID), FOREIGN KEY (CompanyID) REFERENCES m_Company(CompanyID), PRIMARY KEY (`Seqno`,`UserID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; --------------------------------------------------------
- ベストアンサー
- MySQL
- FOREIGN KEYの追加について。
FOREIGN KEYの追加について。 MySQL5.1.37 CREATE TABLE `goods` ( `id` int NOT NULL AUTO_INCREMENT, `num` int NOT NULL DEFAULT '1', PRIMARY KEY (`id`), index (`num`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `sales` ( `id` int NOT NULL AUTO_INCREMENT, `num` int NOT NULL DEFAULT '1', PRIMARY KEY (`id`), index (`num`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 上記のようなテーブルを作り、salesテーブルにCSVファイルからデータをインポートしたのち、FOREIGN KEYを子テーブルに追加したいのですが、下記のようなエラーになります。 ALTER TABLE `sales` ADD FOREIGN KEY ( `num` ) REFERENCES `test`.`goods` ( `num` ) ON UPDATE CASCADE ; MySQLのメッセージ: ドキュメント #1452 - Cannot add or update a child row: a foreign key constraint fails (`test`.`#sql-561_cf`, CONSTRAINT `#sql-561_cf_ibfk_1` FOREIGN KEY (`num`) REFERENCES `goods` (`num`) ON UPDATE CASCADE) データをインポートしたのちにFOREIGN KEYを追加するにはどのようにしたらいいのでしょうか?
- 締切済み
- MySQL
- Mysql delete 参照
恐れ入ります。 Mysql で、2つのテーブルがあり、 1つが1000レコード 2つめが1500レコードあります。 プライマリーコードを参照して、 1つめの1000レコードに、2つめのテーブルを揃えたいのですが、 うまくいきません。 delete from t2 left join t1 on t2.num=t1.num where t1.num IS NULL; としましたがうまくいきませんでした。 1つめのテーブルのレコードにマッチしたもの以外を2つめのテーブルから削除みたいな感じです。 よろしくお願いします。
- ベストアンサー
- MySQL
お礼
回答有難うございます。 「ALTER TABLE 文で参照整合性制約を付け直す。」の例、参考になりました。 テーブルのつくり直ししてしまいました。。