DBの主キーカラムに自動連番(MySQLならAUTO_INCREMENT、SQL ServerならIDENTITY、OracleやPostgreSQLならシーケンス)を設定していると、基本的には連続した数字が付番されていくのですが、行削除もしていないのに抜け番が発生する場合があります。 INSERTが制約にひっかかって失敗した トランザクションをロールバックした などの場合です。 特にトランザクションのロールバックは、DB全体の変更をなかったことにするはずなのに連番だけは進んだまま戻らないということで、知らないと違和感があるものです。 連番が戻らない理由 PostgreSQLのドキュメントがこう説明しています。 同一のシーケンスから数値を取得する同時実行トランザクション同士のブロックを防止するため、nextval演算は決してロールバックされません。 http://www.postgresq
SQL のトランザクションとは、簡単に言ってしまえば、複数の SQL 文によるデータ更新を1つの処理としてまとめてデータベースに反映させることです。 例えば、預金の振替処理を考えると、 (1) 口座Aから1万円を引き落とす(残高が減る)、 (2) 口座Bに1万円を振り込む(残高が増える)、 という処理があり、2つの UPDATE 文を実行する必要があります。 あるいは売上伝票の入力を考えると、 (3) 伝票ヘッダ(顧客情報、売上日時など)の入力 (4) 明細行(商品名、単価、個数など)の入力 というように、複数のテーブルに INSERT 文を実行する必要があります。 いずれの場合も、その一部だけがデータベースに反映されると、一時的にせよ、データベース全体としてデータが不整合な状態になりますが、トランザクションの機能を使えば、これらの処理を同時に実行することができます。 PostgreSQL
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く