Oracleの外部キー制約に関する質問

このQ&Aのポイント
  • Oracleの外部キー制約において、定義済みの列制約に対して追加の定義方法を教えてください。
  • CREATE TABLE文を使用してテーブルを作成し、外部キー制約を追加する場合、ON DELETE CASCADEを使ってT_COL3の制約を追加する方法を教えてください。
  • Oracleのテーブルに外部キー制約を追加する方法について教えてください。
回答を見る
  • ベストアンサー

Oracleの制約構文に関して

Oracleの外部キー(参照整合性)制約に関して質問です。 定義済みの列制約に対して、追加の定義方法がわかりません。 CREATE TABLE TMP (T_COL1 NUMBER(4) CONSTRAINT PK_COL1 PRIMARY KEY, T_COL2 VARCHAR2(10) CONSTRAINT U_COL2 UNIQUE, T_COL3 NUMBER(2) CONSTRAINT FK_COL3 REFERENCES EMP(E_COL1) ); 上記のSQL文を実行した後にT_COL3の制約に"ON DELETE CASCADE" を追加する方法を教えて頂けますでしょうか?

  • Oracle
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.1

一旦DROPして再設定するしかないと思います。 ALTER TABLE TMP DROP CONSTRAINT FK_COL3; ALTER TABLE TMP ADD CONSTRAINT FK_COL3 FOREIGN KEY (T_COL3) REFERENCES EMP(E_COL1) ON DELETE CASCADE; 具体的には http://otndnld.oracle.co.jp/document/products/oracle11g/111/doc_dvd/server.111/E05750-03/statements_3.htm#8072 MODIFY CONSTRAINTはENABLE/VALIDATEなどの設定変更のためにしか使えないです。

関連するQ&A

  • Oracleシルバーの問題です。

    翔泳社オラクルマスター教科書Silverを使ってシルバー取得の勉強をしています。 その中でわからない点があったので教えてください。 1.CONSTRAINT EMP_FK1 FOREIGN KEY(MGR) REFERENCES EMP(EMPNO) 2.CONSTRAINT EMP_FK2 REFERENCES DEPT(DEPTNO) というふたつの制約文で、1.が正解で2が不正解となっているのですが、逆じゃないかな?と思うんです。 だって制約文の構文は 列名 データ型 ,[CONSTRAINT 制約名] 制約 ,[CONSTRAINT 制約名] 制約... とあります。 1.は","で区切ってないから間違いだと思うんですがどうでしょうか? どなたか解説していただけないでしょうか。 宜しくお願いいたします☆

  • Oracleのcreate文で

    OracleのCreate文で、カラムに複数の制約を付ける方法を↓のサイトで見つけたのですが、 http://luna.gonna.jp/oracle/ora_const.html ちょっと、カラム名を変えたりして、このように↓書いてみたのですが、 create table Genereation_T ( Genereation_ID CHAR(3) not null, Genereation_Type VARCHAR2(10), Ins_dt DATE, Udp_dt DATE, Del_flg NUMBER(1), CONSTRAINT cons_p1 PRIMARY KEY(Genereation_ID), CONSTRAINT cons_u1 UNIQUE(Ins_dt), CONSTRAINT cons_f1 FOREIGN KEY(Udp_dt), REFERENCES Genereation_MASTER(Udp_dt), ); 「行10でエラーが発生し、キーワードがありません。」という表示がされます。 もう一個テーブルが必要なのでしょうか? エラー解消がわかる人お願いします。

  • DB2でUNIQUE制約を削除したい

    DB2で以下のように明示的な名前のないUNIQUE制約を削除したいのですが、よい方法をご存じの方がおられましたらご教授ください。 (例) 1. 表の作成 CREATE TABLE TEST ( COL1 INT NOT NULL) 2. 明示的な名前を作成せずにUNIQUE制約を作成 ALTER TABLE TEST ADD UNIQUE (COL1); 上記のように名前指定しなかったUNIQUE制約を ALTER TABLE文で削除したいのですが、どのように すればよろしいのでしょうか? マニュアルの構文では制約名を指定する必要あるようで、 syscat.tabconstカタログで自動でつけられた制約名を調べた後、 以下のように指定したところ制約は削除されました。 (例) ALTER TABLE TEST DROP CONSTRAINT SQL090123084403480 しかしプログラムの修正が少なくなるよう、制約名を調べずにALTER TABLE 一文で削除できないものかと悩んでおります。 もしくはストアドプロシージャでも構いません。 よろしくお願いします。

  • Mysqlのconstraintについて教えてください (難題)

    回答者がつかなかったので再度。 Q1.単順にKEY指定するのとどこが違うのですか? show indexで見た限り、下記の(1)と(3)の違いが分かりません。 Q2.constraint_nameはどこに行ってしまったのですか? show indexで見ると、unique(it1)で指定した項目it1がそのままインデックス名になります。 constraint_nameで指定した名前はどこに行ったのでしょうか? (1)constraintで定義、インデックス名を指定。 mysql> create table t1 (it1 tinyint(1),constraint constraint_name unique(it1)); (2)UNIQUE KEYで定義、インデックス名を指定。 mysql> create table t2 (it1 tinyint(1),UNIQUE KEY UNIQUE_KEY_NAME (it1)); (3)UNIQUE KEYで定義、インデックス名=Key項目名。 mysql> create table t3 (it1 tinyint(1),UNIQUE KEY it1 (it1));

  • MySQL5.1 で外部キーの動作を検証する方法?

    お世話になります。 MySQL 5.1 で勉強中の初心者です。 外部キーの設定が出来ているらしいのですが、親テーブルを更新しても子テーブルに反映されません。 一応 http://oshiete1.goo.ne.jp/qa3828231.html も見ましたが、MySQLのバージョン(4.0)が違うのが気になります。 持っている教科書には ENGINE=InnoDB の記述がありません。 自分のコード: ---------- 親 ---------- mysql> create table tes1 ( t1_col1 int (4), t1_col2 varchar (10), primary key (t1_col1) )engine=innodb; mysql> desc tes1; +---------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+-------------+------+-----+---------+-------+ | t1_col1 | int(4) | NO | PRI | 0 | | | t1_col2 | varchar(10) | YES | | NULL | | +---------+-------------+------+-----+---------+-------+ mysql> select*from tes1; +---------+---------+ | t1_col1 | t1_col2 | +---------+---------+ | 1 | Upd | | 2 | Upd | +---------+---------+ ---------- 子 ---------- mysql> create table tes2( t2_col1 int (4), t2_col2 varchar (10), t1_col2 varchar (10), primary key (t2_col1), foreign key (t1_col2) references tes1 on update cascade ); mysql> desc tes2; +---------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+-------------+------+-----+---------+-------+ | t2_col1 | int(4) | NO | PRI | 0 | | | t2_col2 | varchar(10) | YES | | NULL | | | t1_col2 | varchar(10) | YES | MUL | NULL | | +---------+-------------+------+-----+---------+-------+ mysql> select*from tes2; +---------+---------+---------+ | t2_col1 | t2_col2 | t1_col2 | +---------+---------+---------+ | 1 | line11 | Upd | | 2 | line22 | Upd | +---------+---------+---------+ これで親の t1_col2 を更新して、子のテーブルを見ると何も変わっていません。何か無茶をしでかしている気はするんですが、いかんせん経験不足で原因が掴めません。どなたかアドバイスいただけると有り難いです。 宜しくお願いします。orz

    • ベストアンサー
    • MySQL
  • 続oracleのプライマリ・キー名の変更について

    oracleのテーブル名を変更します。 運用上ネーミングルールとしてプライマリ・キー名はpk_テーブル名としていますので、 プライマリ・キー名もこの時に変更したいのですが、適切な手順を教えてください。 旧テーブル名:table_a 旧プライマリ・キー名:pk_table_a  ↓ ↓ ↓ 新テーブル名:table_b 新プライマリ・キー名:pk_table_b という質問をさせて頂きました。 回答を頂き、一旦納得した気がしたのですが、どうもうまくいきません。 下記を実行すると4のところでコケます。 既にオブジェクトが存在するというものです。 どうやら 2のところのプライマリキー名変更がうまくいっていないか pk_table_aがどこかにゴミとして残っているように思えます。 オブジェクトブラウザというツールで見てみると、 CONSTRAINTにpk_table_bが INDEXのところにpk_table_aが見えています。 手順がおかしいのか? コマンドが間違えているのか? それともプライマリキー名の変更はしない方が良いのか? ここら辺を教えてください。 --1.TABLE 作成 CREATE TABLE table_a ( ITM1 VARCHAR2(10) NOT NULL, ITM2 DATE, CONSTRAINT pk_table_a PRIMARY KEY (ITM1) USING INDEX ) / --2.プライマリキー名変更 ALTER TABLE table_a RENAME CONSTRAINT pk_table_a TO pk_table_b / --3.テーブル名変更 RENAME table_a TO table_b / --4.「1」と同じTABLE 作成 CREATE TABLE table_a ( ITM1 VARCHAR2(10) NOT NULL, ITM2 DATE, CONSTRAINT pk_table_a PRIMARY KEY (ITM1) USING INDEX ) /

  • クエリの書き方

    Oracle11gを使用しています。以下のような3つのテーブルがあります。 (1)駅マスタテーブル create table tbl_station ( ID NUMBER PRIMARY KEY, Name varchar2(32), ); (2)レストランマスタテーブル create table tbl_restaurant ( ID NUMBER PRIMARY KEY, Name varchar2(32), ZipCode varchar2(8), Prefecture varchar2(32), City varchar2(32), StreetAddress varchar2(64), PhoneNumber varchar2(20), NearestStation NUMBER, constraint fk1_tbl_restaurant foreign key (NearestStation) references tbl_station(ID) ); (3)評価トランザクションテーブル create table tbl_gradings ( RestaurantID NUMBER, UserID varchar2(255), Gradings NUMBER, Primary Key (RestaurantID, UserID), constraint fk1_tbl_gradings foreign key (RestaurantID) references tbl_restaurant(ID), constraint fk2_tbl_gradings foreign key (UserID) references EXTERNALUSERTBL(EXTERNALTBLUSERID) ); 以下のようにデータを入力してみました。 (1)駅マスタテーブル ID, Name 1, 新宿 2, 渋谷 3, 銀座 (2)レストランマスタテーブル ID, Name, ZipCode, Prefecture, City, StreetAddress, PhoneNumber, NearestStation 1, レストラン1, 100-1000, 東京都, 新宿区, 西新宿1-1-1, 03-1111-1111, 1 2, レストラン2, 300-3000, 東京都, 中央区, 銀座1-1-1, 03-3333-3333, 3 3, レストラン3, 100-1001, 東京都, 新宿区, 東新宿1-1-1, 03-1111-2222, 1 4, レストラン4, 200-2000, 東京都, 渋谷区, 渋谷1-1-1, 03-2222-2222, 2 (3)評価トランザクションテーブル RestaurantID, UserID, Gradings 1, User1, 5 1, User2, 3 2, User1, 5 このような場合に、以下のようなデータを出力するクエリを書きたいのですが、書き方がわかりません。 内容:全てのレストラン情報を評価の平均値とともに重複なく表示。 出力イメージは以下のようなものです。 ID, レストラン名, 郵便番号, 都道府県, 市区町村, 町名番地, 電話番号, 最寄駅, 平均評価 1, レストラン1, 100-1000, 東京都, 新宿区, 西新宿1-1-1, 03-1111-1111, 新宿, 4 2, レストラン2, 300-3000, 東京都, 中央区, 銀座1-1-1, 03-3333-3333, 銀座, 5 3, レストラン3, 100-1001, 東京都, 新宿区, 東新宿1-1-1, 03-1111-2222, 新宿 4, レストラン4, 200-2000, 東京都, 渋谷区, 渋谷1-1-1, 03-2222-2222, 渋谷 最寄駅名、評価を出力することから3テーブル全てを結合し、さらにAVG関数を使って平均の評価値をレストラン毎に計算する必要があり、僕には難しいです。。おわかりの方、宜しくお願いします。

  • Oracleでテーブルを作成する際に、インデクスの作成先を指定したい。

    以下のようにテーブルを作成しようとしてます。 CREATE TABLE TEST_USER.M_USER ( ID char(4), NAME varchar2(40) NOT NULL), CONSTRAINT PK_USER PRIMARY KEY(ID) ); さて、プライマリキーを定義しているので、インデクスが作成されるはずです。 この作成先のテーブルスペースを指定したいのですが、方法が解りません。 CREATE TABLEの紹介をしているサイトにものっていなくて、途方にくれています・・・。 CONSTRAINT句を使えばいいのでしょうか?

  • 外部キー制約について

    いつも参考にさせて頂いています。 現在テーブル作成時に外部制約キーをつけようとしていますが、下記のSQLを実行しようとするとエラーが出てしまいます。 以下実行SQL---------- CREATE TABLE … FOREIGN KEY (AAA) REFERENCES table_name (AAA) ON DELETE CASCADE ON UPDATE CASCADE ) TYPE=InnoDB; 以下エラー内容------ ERROR 1005: Can't create table '.\hobi\h_category_syobunrui.frm' (errno: 150) googleとかで調べてみると複合インデックス?というものを張ればいいとは書いていましたが具体的に複合インデックスがどういうものなのかよくわかりませんでした。 同じような症状が出たことがある方、又詳しいかたいらっしゃいましたら宜しくお願いします。

    • ベストアンサー
    • 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