人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

MySQL のSQL文の書き方についての質問です。
table A,Bともに uid,name の項目があります。やりたいことはuid に関するA,Bの差分処理です。
uid はユニークキーです。

1. A から、 Bにない uidのデータを削除する
2. A に Bにのみあるuid のデータを追加する。

table A には、uid,name 以外にも項目ありますので、いれかえるわけにはいきません。
これは、それぞれ1つのSQL文で可能なのでしょうか? バージョンにより可能不可能も
あるかと思いますのでよろしくお願いします。


●質問者: isogaya
●カテゴリ:コンピュータ 科学・統計資料
✍キーワード:MySQL name SQL にの キー
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● Mook
●27ポイント

前者はひとつのSQL 実行できると思います。

DELETE FROM tableA WHERE uid NOT IN ( SELECT uid FROM tableB)

(データの削除ですので、テスト環境等で動作を確認ご使用ください。)


後者は、MySQL のバージョンが5以上であればストアドプロシージャで処理すれば、保守が簡単かと思いますが、

プロシージャが使用できない場合は以下のような方法もあると思います。

SELECT CONCAT('INSERT INTO tableA (uid, name) VALUES (', uid, ', \'', name, '\');' )
FROM tableB WHERE uid NOT IN ( SELECT uid FROM tableA )

これで実行された結果をSQL として実行すれば、結果として後者を実現できるかと思います。

http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/mysql_14.htm

http://dev.mysql.com/doc/refman/5.1/ja/stored-procedures.html


2 ● b-wind
●27ポイント

1.はサブクエリがいるので基本的には MySQL4.1 以上。

MySQL :: MySQL 4.1 リファレンスマニュアル :: 6.4.2 サブクエリ構文

DELETE FROM A WHERE uid NOT EXISTS ( SELECT * FROM B WHERE B.uid = A.uid )

2.はサブクエリの方が分かりやすいけど、これなら一応 3.X 系でも動くはず。

MySQL :: MySQL 4.1 リファレンスマニュアル :: 6.4.3 INSERT 構文

INSERT INTO A ( uid,name )
 SELECT B.uid, B,name FROM B LEFT JOIN A ON B.uid = A.uid WHERE A.uid IS NULL
◎質問者からの返答

これでいったらよさげですね。試してみます。


3 ● pahoo
●26ポイント

JOIN 構文を使ってできます。


1. A から、 Bにない uidのデータを削除する

DELETE A FROM A LEFT JOIN B ON A.uid=B.uid WHERE A.uid IS NOT NULL AND B.uid IS NULL;

2. A に Bにのみあるuid のデータを追加する。

INSERT INTO A(uid,name) SELECT B.* FROM A RIGHT JOIN B ON A.uid=B.uid WHERE A.uid IS NULL AND B.uid IS NOT NULL;

参考サイト

◎質問者からの返答

なるほど

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ