C Sharpens you up

http://qiita.com/yuba に移しつつあります

SQL

SQLの文法がこう拡張されるとうれしい

SQL

SQLを書いていていろんな場面で「こんな文法であってくれたら!」と歯がゆい思いをすることは多々あります。 これまでに、こう拡張されてくれたらと思った内容をまとめてみました。 なお、この拡張は各社DBの“方言”とはまた別のものです。各社方言とは直交し…

DBの自動連番がロールバックしても戻らない理由

SQL

DBの主キーカラムに自動連番(MySQLならAUTO_INCREMENT、SQL ServerならIDENTITY、OracleやPostgreSQLならシーケンス)を設定していると、基本的には連続した数字が付番されていくのですが、行削除もしていないのに抜け番が発生する場合があります。 INSERT…

SQLプログラミング課題・表示順変更の実現

SQL

CodeIQの問題・パズルを考えよう!(by CodeIQ×はてな)タイトル見ただけで苦労の記憶がよみがえってきた方はその時点で合格ってことでいいかもしれません。INT型の主キーを持ったテーブルがあり、1行を1アイテムとして表示できます。 CREATE TABLE items ( …

SQL Serverでも論理削除と一意性制約を両立

SQL

一意性(UNIQUE)制約はNULLでない値に対してだけ効く、そう思っていた頃が私にもありました… SQL ServerはNULLも一意性制約の対象になります。NULLになっている行が複数あると重複だと判定されます。SQL-92の規格書をあたってみると、これは完全な規格違反な…

SQL製品別・XORと同値の書き方

SQL

SQLにブール型が定義されたのはSQL99と比較的最近のことなので、ブール型への対応にはまだばらつきがあります。 Oracle(12c), PostgreSQL(9.x) … 対応 SQL Server(2012), MySQL(5.x) … 非対応。1ビット整数のBIT型を代わりに持つ。 XOR(両辺の論理式のうち…

SQL Serverの計算列を使ってツリー構造データを完全に制約付ける

SQL

ツリー構造をSQLで扱うための定石はいくつか知られています。 隣接リスト最も単純で、各行が親に当たる行を自己結合で参照します。構造は単純ですが、古いSQLでは子孫を一気に取得する方法がないのでSQLアンチパターンでは「ナイーブツリー」と命名して安易…

データベースでクラス継承を表現する

SQL

こんなスキーマ設計を見ました。 CHECK制約で排他的サブタイプを実現する - pikio公式ブログ オブジェクト指向のプログラミングでは、クラスを継承してサブクラスを作ることはよくあります。そして、アプリケーションではデータを複数のサブクラスに分けて扱…

外部キー参照しあうテーブルを遅延制約で実現する

SQL

先に結論。DEFERRED, DEFERRABLEという単語を覚えてお帰りくださいませ。 そして先にごめんなさい。SQL ServerとMySQLはDEFERRED, DEFERRABLEを未サポートですのでこの記事の内容は使えません。さて話のはじめから。こんな条件のデータを格納したくなったと…

データベース操作でデッドロックは不可避

SQL

デッドロック発生させたと聞いただけで「うわ出たド素人」「それだけはないでしょ」「設計の仕方教わらなかったの?」と炎上3波目くらいまで装弾済みの怖い怖いお兄様方お姉様方こんばんは。案外知られていないのでこの機会に確認しておいていただきたいのは…

有効なレコードだけに一意性制約をかける

SQL

SQL標準にある強力なCHECK制約をPostgreSQLでも使いたいでござる。 有り体にいうと、一意性制約を付けて論理削除をしたい、というような表現になるのでしょうか。 http://sugar-tomato.hateblo.jp/entries/2013/07/02 無効化したレコードは無視して有効なレ…

SQLのカラム制約はテーブル制約と等価

SQL

SQLのテーブルにcol_A, col_Bというカラムがあるとしますよ。ここでCHECK(col_A = col_B)という制約を、col_Aにカラム制約として付けたとします。すると UPDATE my_table SET col_A = col_A + 1; なんて操作は阻止されます。当然。では、 UPDATE my_table SE…

Play! framework Evolutionsでストアド関数を書きたい

Evolutionsに指定したSQL文は適用のとき、セミコロンで分解されて一文ずつデータベースに送信されます。 ではストアド関数に含まれるセミコロンはどうなるか。 やはりぶった切られてしまいます。当然文法エラー。ではぶった切られないようにするにはどうする…

Play! framework Evolutionsのsqlファイルの優先順位

Play! frameworkではEvolutionsファイルを書くことでデータベースへのスキーマ適用とか更新がWebからワンタッチできるようになります。ありがたいですね。sqlスクリプトファイルがスキーマ変更1件を表していて、【変更を適用するSQL文(Ups)】【変更を取り消…