![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
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'"
よろしくお願いいたします。
No.1ベストアンサー
- 回答日時:
失礼ながら、いろいろな勘違いをしているようです。
update文で、複数の表を更新することはできません。あくまでも、1表だけです。
他の表の列値で更新することは可能で、サブクエリを使う方法以外に、
update 表1
set 列2=表2.列2
from 表2
where 表1.列1=表2.列1
のように、ジョインで得られた結果で更新可能ですが、更新対象はこの例では表1です。
updateでこの例のように、複数表を指定する構文を持っているRDBMSがあり、RDBMSにより構文が違う場合もあります。
>UPDATE TABLE_A INNER JOIN TABLE_B on TABLE_A.ID=TABLE_B.ID2
複数のRDBMSを知っていますが、このような構文は、見たことがありません。なぜ、このような構文を思いついたのでしょうか?
外部キー(参照制約)についても、正しく理解されていないようです。
参照制約は、以下の制約で親子間の不整合を防ぎます。これは、階層DBやネットワーク型DBの特性を、RDBMSに取り入れたものです。
親子間の不整合の発生をRDBMS側で防止してくれる一方で、オーバヘッドがあったり、運用上の注意(親の表を削除する場合、子の表を先に削除など)が必要になります。
アプリケーション側で不整合を発生させないようにできるなら、わざわざ参照制約を使う必要はありません。
表定義でのディフォルトの指定(NO ACTION)での動作は、次のようになります。
(1)子のいる親の主キーは、更新できない。
→子の外部キーを一旦、null等に更新し、子のいない状態で親の主キーを更新。その後、子の外部キーを親の主キーと同じ値に更新する。
(2)子のいる親は、削除できない。
→子を削除してから、親を削除
表定義で、「ON UPDATE CASCADE」、「ON DELETE CASCADE」を指定した場合は、次のような動作になります。
(1)親の主キーを更新すると、子の外部キーも自動的に更新。
(2)親を削除すると、子も削除。
どちらの動作をさせたいでしょうか?
それにより、表定義を変えるか、SQLの発行順などが変わってきます。
=====例1(NO ACTION)=====
1.定義
create table tbl1
(pkey char(2) primary key,
data varchar(10));
create table tbl2
(pkey int primary key,
fkey char(2),
data varchar(10),
constraint tbl1_tbl2
foreign key(fkey) references tbl1(pkey)
match simple
on update no action
on delete no action
)
;
create index tbl2idx1 on tbl2(fkey);
2.操作
(1) 子のいない親の主キー更新
update tbl1
set pkey='10'
where pkey='04';
(2) 子のいる親の主キー更新
-- 子を更新して、親との関係を一時的になくす
update tbl2
set fkey=null
where fkey='03';
-- 親を更新
update tbl1
set pkey='05'
where pkey='03';
-- 子を親に対応付け
update tbl2
set fkey=tbl1.pkey
from tbl1
where fkey is null
and tbl1.pkey='05';
または
update tbl2
set fkey='05'
from tbl1
where fkey is null;
=====例2(CASCADE)=====
1.定義
create table tbl1
(pkey char(2) primary key,
data varchar(10));
create table tbl2
(pkey int primary key,
fkey char(2),
data varchar(10),
constraint tbl1_tbl2
foreign key(fkey) references tbl1(pkey)
match simple
on update CASCADE -- no action
on delete CASCADE -- no action
)
;
create index tbl2idx1 on tbl2(fkey);
2.操作
(1)親の更新の背景で、子も更新
update tbl1
set pkey='05'
where pkey='03';
※子の表に対する操作は、SQL上はないが、RDBMSにより更新されている。
ありがとうございます。
すみません。勉強不足で・・・。
UPDATE TABLE_A INNER JOIN TABLE_B on TABLE_A.ID=TABLE_B.ID2
に記述したのは、ACCESSのクエリーを使ったら、そのようにSQLを作成したので・・・。
表定義で、「ON UPDATE CASCADE」、「ON DELETE CASCADE」を
記述すればよいのですね。
今回はアプリケーション側で不整合を発生させないように変更いたしました。
詳しい説明本当にありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- MySQL my_itemsテーブルのIDにAUTO_INCREMENT を追加ができるかで 1 2023/01/03 09:09
- MySQL エラー 1068 (42000): 複数の主キーが定義されていますエラー 2 2022/11/17 04:36
- PHP php エラー 2 2022/10/23 16:43
- AJAX JavascriptからPHPへのAjax通信でnullが返ってくる 3 2022/08/03 22:00
- MySQL MYSQL エラー 2 2022/10/18 11:37
- MySQL `picture` varchar(255) のコマンドで間違いないでしょうか? 1 2022/11/21 04:08
- MySQL テーブル作成時のカラムについて 2 2022/08/27 21:48
- MySQL テーブル作成です。どこかのスペルが間違っているか記号など スペースかな? 1 2022/10/01 05:08
- PHP htmlで複数の個数入力欄を表示させるには 1 2022/09/20 03:11
- JavaScript javascriptでテーブルに追加した項目のid追加してローカルストレージを操作したい 5 2023/01/01 15:52
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
外部参照してるキーを主キーにすることは可能?
その他(データベース)
-
外部キーだけのテーブル(主キーがない?)
その他(データベース)
-
テーブルに主キーを作らないデメリットは?
その他(Microsoft Office)
-
-
4
入力値と外部キーをINSERTするには
MySQL
-
5
SELECT INTOで一度に複数の変数へ代入をするにはどのようにすれがよいでしょうか?
PostgreSQL
-
6
データベース関係で、データの洗い替えとはどのような事を行うことでしょう
IT・エンジニアリング
-
7
GROUP BYを行った後に結合したい。
Oracle
-
8
含まない言い方ってどうしたらいいんでしょうか
日本語
-
9
「マスタ」と「テーブル」の違いとはなんでしょうか?
Oracle
-
10
データベースのINT型項目にNULLはNG?
MySQL
-
11
SQLで列名を変数にできないでしょうか
SQL Server
-
12
[JAVA]try 内の変数を外で!?
Java
-
13
do-while文が禁止される理由
C言語・C++・C#
-
14
VB.NETでフォーム上にExcelのような表を表示する方法
Visual Basic(VBA)
-
15
2つの項目が重複するレコードを抽出する方法はありますか?
MySQL
-
16
この行は既に別のテーブルに属しています
Visual Basic(VBA)
-
17
UPDATE文のWHERE条件に他のテーブルのフィールドも入れたい
SQL Server
-
18
オラクルではできるのにSQLSERVERではサブクエリーで複数キーを指定できない?
SQL Server
-
19
[ BETWEEN ] vs [ >= AND <= ]
MySQL
-
20
MAX関数を使ってからLEFT JOINしたいのですが・・
PHP
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
親の年齢知らない人って多いと...
-
親にあんたと呼ぶ子供は絶対に...
-
子供の部屋のものを勝手に捨て...
-
殴れば殴り返されるものでしょ...
-
親に手を出すとかありえない、...
-
住宅街で騒ぐガキ
-
子供の髪を染める親をどう思い...
-
信じられないほど生意気な餓鬼は
-
親と子の性格は似てくるか正反...
-
家族でテレビを見ている時に、...
-
【産んだ親を恨む子供が急増中...
-
アニメのナルトが冷たい目で見...
-
躾のときに施設を持ち出す親
-
親に敬語使うんですか?
-
あなたの感覚でいいので、教え...
-
ヤンキー、不良はなぜ早くに親...
-
30過ぎて子供産むのは親のエゴ...
-
携帯破壊
-
「高校生の子に対し、抗議の意...
-
子供の頃に親からされたお仕置...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
幼児と小学三年生がエロ動画
-
親にあんたと呼ぶ子供は絶対に...
-
悠奈をハナと読むのはキラキラ...
-
外部キーが設定されているテー...
-
躾のときに施設を持ち出す親
-
親になる資格のない人ってどん...
-
親より先に死んだら地獄行き
-
明るい子供とおとなしい子供っ...
-
あなたの感覚でいいので、教え...
-
子供の成長を・・
-
親の年齢知らない人って多いと...
-
9歳の弟がyoutubeでグロ動画ば...
-
殴れば殴り返されるものでしょ...
-
子供の髪を染める親をどう思い...
-
親に手を出すとかありえない、...
-
見てくださいこれ、 世の中には...
-
【産んだ親を恨む子供が急増中...
-
信じられないほど生意気な餓鬼は
-
親と子の性格は似てくるか正反...
-
親に何でもかんでも口出しされ...
おすすめ情報