Slide 1

Slide 1 text

データベースで 沼った話

Slide 2

Slide 2 text

自己紹介

Slide 3

Slide 3 text

● 木村 宗吾(k1mu) ● 所属 ○ 株式会社ラクーンホールディングス技 術戦略部 ● 領域 ○ バックエンド(+フロントエンド) ● 言語 ○ 業務 ■ Java PHP ○ 業務外 ■ Go C(++) ● X ○ @detunote

Slide 4

Slide 4 text

なぜこの話をするのか ● テーマが初めてのLTとの事で、せっかくなら1年目として印象に残ったことを話す と面白いのでは ● DBを触る方は多いと思うので、知らなかったのであればこれからの知見として ほしい

Slide 5

Slide 5 text

DBに関して

Slide 6

Slide 6 text

皆さんDBは何を使った事があります?

Slide 7

Slide 7 text

今回の説明で使うDB

Slide 8

Slide 8 text

沼った問題

Slide 9

Slide 9 text

前提 (テーブル)

Slide 10

Slide 10 text

前提 (データ)

Slide 11

Slide 11 text

テーブルをUPDATE UPDATE users SET name = '木村' WHERE id = 3; ID3の名前を木村に変更するUPDATEを実行する

Slide 12

Slide 12 text

結果 ID3の名前が変わっている MySQL ORACLE

Slide 13

Slide 13 text

別のSQLエディター 等で確認 Oracleの方ではID3の Nameが変わっていない ORACLE MySQL

Slide 14

Slide 14 text

内容が反映されていな い...!?

Slide 15

Slide 15 text

最後にCommitした?

Slide 16

Slide 16 text

解決方法 UPDATE users SET name = '木村' WHERE id = 3; commit;

Slide 17

Slide 17 text

結果 別のエディターで見ても データが入っていて UPDATEもされている。

Slide 18

Slide 18 text

DBに反映された!

Slide 19

Slide 19 text

原因 ● コミットしていなかったため、利用中のトランザクションでしかUPDATEが反映さ れていなかった。 ● 正直MySQL = ORACLE のように考えていた。 ○ MySQLなどにはAuto Commitがあり、標準ではONになっているので最後に自分で Commitを 明示的に宣言する必要がない。 ○ OracleにもAuto Commitがあるが標準ではOFFになっている。

Slide 20

Slide 20 text

他にも ● バージョンによってOracleにはオートインクリメントがない ○ シーケンスを利用して連番を生成する必要がある。 ● LimitがないのでRowNumを利用して行数を制限 ● SELECT句にGROUP BY句にない列を含めることができるが、その列は集約関 数の中で使用される必要がある。 ● Oracleでは空文字はNullと同等に扱える

Slide 21

Slide 21 text

仕様はちゃんと 調べてから使おう

Slide 22

Slide 22 text

宣伝 弊社のconnpassページ https://raccoon-holdings.connp ass.com