🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

3回答

7352閲覧

MySQLでORACLEのrowidの代わりとなる記法

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2019/11/12 01:43

前提・実現したいこと

ORACLEのSQLをMySQLに移行しています。
rowidを更新条件に使用している下記のようなSQLがあるのですが、
MySQLにはrowidがありません。
これは、プライマリーキー全てが異なるというように読み替えれば良いでしょうか?

該当のソースコード

SQL

1UPDATE TBL_A A 2SET FLG = '1' 3WHERE A.KEY = 〇〇〇 4 AND EXISTS (SELECT 1 5 FROM TBL_B B 6 WHERE B.NKEY = A.NKEY 7 AND A.ROWID <> B.ROWID);

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ORACLEのrowidはよくわからなのですが、レコードを特定するためのidということでしたら
auto_incrementを指定したプライマリーキーを設定しておけばよいと思います

投稿2019/11/12 01:51

yambejp

総合スコア116661

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/11/12 02:07

SQLの変更だけでは無理で、実現にはテーブル定義を変更する必要があるということでよろしいでしょうか?
yambejp

2019/11/12 02:16

> テーブル定義を変更する rowidが存在しないのですからそれを補うためには何らかの処理は必要でしょう。 ただし、SQLの常識ではすべてのテーブルはプライマリーキーを設定すべきなので auto_incrementでなくてもプライマリーキーを利用すればあえて拡張しなくても rowid的なことは可能だと思います
guest

0

ベストアンサー

Oracle に置ける ROWID は、データベース上の「物理的なレコードのアドレス」を示すIDです。
そのため ROWID を WHERE 条件に指定することは、レコードを一意に特定するのと同義です。
※格納しているファイルへ直接アドレッシングしてるようなものなので、最速アクセスになります

MySQL では同様の疑似列は存在しませんので、「レコードを一意に特定できるキー」を指定してやることになります。通常はプライマリーキーを指定してやればよいです。

ただ……元のコードがなんかおかしいような気がしますね。
TBL_A のレコードと TBL_B のレコードとで ROWID を比べても意味がありません。
※ほとんどの場合、ROWID は データベース内で 一意です。

投稿2019/11/12 02:41

tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/11/12 07:56

私も、「A.ROWID <> B.ROWID」が何をしたいのかよく分かりませんでした。 とりあえず、該当箇所を「PK <> PK」みたいな感じになるように書き換えてみようと思います。 ご回答、有難う御座いました。
guest

0

ROWIDをPRIMARY KEYにする信者はもうとっくに滅んだと思っていましたが。

Oracle7やOracle8.0 辺りで、UPDATE で行移動が起きたり、exp/imp で ROWID が変わってトラブルが続出してもROWID信仰を捨てない会社がありました。

投稿2019/11/12 02:21

Orlofsky

総合スコア16417

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tacsheaven

2019/11/12 02:48

昔関わったプロジェクトでは、バッチ処理で集計繰り込みやる関係で対象データを一度全部読み取って、プログラムで正しい状態を(オンメモリで処理して)確定させてから、必要な行の更新と削除をやる、って作りにしたんで、ROWID を使って更新と削除を高速化した記憶が。 あくまでもその間に自分自身以外からはDB操作が行われないという条件だからこその手段でしたね。
Orlofsky

2019/11/12 02:58

そのとおり。ROWID はあくまでも一時的に利用する用途限定です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問