環境はPostgreSQL 9.0です。

id(char(1))   number(integer)
1          1
2          2
3          3

っていうテーブルがあって、numberにUNIQUE制約が掛かっています。
一回のupdate文でnumを1ずつ増やしたいんですが、更新順序の指定
ってどうやるんですか?

UPDATE table SET number = number+1

だと重複違反になるから、numberが大きい奴から更新したいんですよね。
誰か教えてくれませんか?

このQ&Aに関連する最新のQ&A

A 回答 (2件)

PostgreSQL 9.0 であれば、UNIQUE制約に遅延設定をするのはいかがでしょう?



ALTER TABLE ... ADD { UNIQUE | PRIMARY KEY } (...) DEFERRABLE

参考URL:http://lets.postgresql.jp/documents/technical/9. …
    • good
    • 0

次の1か2で実現できると思います。



方法1
・UNIQUE制約を外す

・numを1加算する

・再度UNIQUE制約を設定する

方法2
・コピーテーブルを作成する(テーブル名以外は、元テーブルと全く同じ)。

・以下のSQLで元テーブルのレコードをコピーテーブルにコピーする
 INSERT INTO コピーテーブル SELECT * FROM 元テーブル

・元テーブルのレコードを全件削除する

・コピーテーブルのnumに1加算して元テーブルにレコードをコピーする
 INSERT INTO 元テーブル SELECT id, number + 1 number FROM コピーテーブル ORDER BY number DESC
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qラ・フォル・ジュルネ 児玉麻里・桃姉妹の公演

5/6(日)のラ・フォル・ジュルネで、児玉麻里・桃姉妹の演奏を聴きました。ホールB7で行われた公演でしたが、どちらが麻里さんでどちらが桃さんなのか分かりませんでした。
ご覧になった方がいらっしゃったら教えてください。
ストレートヘアでわりと体を動かしながらダイナミックな演奏をされる方と、ふわっとした髪型の方。
お二人とも演奏がとても素晴らしく、それぞれの個性も伝わってきました。それだけにどちらが麻里さん、桃さんなのか知りたくなりました。

Aベストアンサー

まったく自信ないんですが、ストレートが麻里さんでふわっとした髪は桃さんではないでしょうか?

たまたま今、N響のホームページチェックしてたら写真が掲載されていて、この質問を思い出したので来てみました。

ラ・フォルジュルネ行きたかった!!!

QPostgreSQLのUPDATE文につきまして

お世話になります。

phpPgAdminで更新作業をしていまして

一件一項目の更新で
update "store_table" set "tenpo_add" = '東京都1-1-1' where "kaiin_no" = '123456';

とした場合はうまく更新でできたのですが、以下のように複数項目の更新が文法エラーになります。

update "store_table" set "tenpo_post1","tenpo_post2","tenpo_add" = '123','4321','東京都1-1-1' where "kaiin_no" = '123456';

このようにした場合、  "," ←この部分が文法上おかしいとのエラーが出ました。

どのように記載すれば良いかご指導いただければ幸いでございます。。

Aベストアンサー

おそらくSQL文の間違えになると思います。

update "store_table" set "tenpo_post1" = '123', "tenpo_post2" = '4321', "tenpo_add" = '東京都1-1-1' where "kaiin_no" = '123456';

上記のように1つ1つ値を設定するような形が、
複数項目をUPDATEする場合の記述になります!

Q梨花?

「結婚できない男」の中で、トヨタのディーラーで国仲涼子の友人役としていっしょに働く女性が梨花かと思ったのですが、出演者の紹介の中にないようです。梨花ほどの知名度であれば、国仲と対等に近いキャラで出そうなものですし、梨花ならもう少しはじけそうな気がするので、微妙に梨花と違う気もします。この人は誰なのでしょうか?

わかる方、あすの放送までで構いませんので教えてください。

Aベストアンサー

SHEILA(シェイラ)さんです。
確かに梨花に似てますよね☆

参考URL:http://www.consheila.com/index.html

QPostgreSqlのテーブルをVBから更新

PostgreSqlのテーブルをVBから更新

【テーブル】
tbl1 (
item1 integer not null, -- 数値:ユニークキー
, item2 character varying, -- 文字
, item3 timestamp without time zone -- タイムスタンプ
, CONSTRAINT tbl1pk PRIMARY KEY (item1)
)

【仕様】
1.テーブル内の特定の1レコードを取得

2.取得したレコードをVBの画面に表示

3.入力:VBの画面で item2 の表示内容を変更

4.ボタン入力
4-1.レコードが存在しない場合
 メセージボックスに「誰かが消した」と表示

4-2.タイムスタンプに変化がある場合
 メセージボックスに「誰かが変更した」と表示

4-3.タイムスタンプに変化がない場合
 Updateする。


【前提】
普通にアップデートするだけなら、下記でできました。

Private DateTime1 As DateTime ' 画面表示の時に取得したitem3の値が入っているとする
 :
 :
Dim NpgsqlConnection1 As NpgsqlConnection = New NpgsqlConnection
Dim NpgsqlCommand1 As NpgsqlCommand = New NpgsqlCommand

NpgsqlCommand1 = NpgsqlConnection1.CreateCommand
NpgsqlCommand1.CommandText = "update tbl1 " _
& "set item2 = '" & Me.TextBox1.Text & "'" _
& ", item3 = current_timestamp " _
& "where item1 =" & キー値
NpgsqlConnection1.ConnectionString = 接続情報

NpgsqlConnection1.Open()
NpgsqlCommand1.ExecuteNonQuery()
NpgsqlConnection1.Close()


【考察】
変更された場合は、更新対象外にするのは、条件に入れればなんとかなります。

NpgsqlCommand1.CommandText = "update tbl1 " _
& "set item2 = '" & Me.TextBox1.Text & "'" _
& ", item3 = current_timestamp " _
& "where item1 =" & キー値 _
& "and date_trunc('second', item3) =" & "to_timestamp('" & Format(DateTime1, "yyyy-MM-dd HH:mm:ss") & "', 'YYYY-MM-DD HH24:MI:SS')"

しかし、これではこのSQLで更新されたのか、他で更新があったためにスキップしたのかが分かりません。

直前のSQLで更新があったかどうか、もしくは何件更新対象になったかを得る事はできませんか?


もしくは、
一旦呼び出してロックし、その間にタイムスタンプを取り出し、
Vb内に持っていた前回のタイムスタンプと比較し、同じであれば更新する。
同じでなければステータスを返す。
というふうにしたいです。



【質問】
アップデート文で更新対象になった件数を取得する事はできませんか?


もしくは、フェッチの方法を教えて下さい。
上記の仕様のようにタイムスタンプを判断し、そのレコードを掴んだままアップデートしたいなら、フェッチするしかないのかと思っています。
でも、そのやり方が分かりません。

・コネクト
・カーソル定義
・カーソルオープン
・ネクストレコード
・レコードを取得し、VB側のタイムスタンプと比較←どうやって?
・カーソル行に対しアップデート
・レコードの終わり
・0件なら「誰かが消した」と表示
・カーソルクローズ
・コネクト解除

やりたい事は上記でSqlもVbも分かるのですが、インターフェイス込みでコマンドレベルの方法が分かりません。

フェッチでの方法が分からないので教えて下さい。

フェッチで以外の方法で同等の事が出来るもっと良いやり方があれば教えて下さい。


以上、よろしくお願いします。

PostgreSqlのテーブルをVBから更新

【テーブル】
tbl1 (
item1 integer not null, -- 数値:ユニークキー
, item2 character varying, -- 文字
, item3 timestamp without time zone -- タイムスタンプ
, CONSTRAINT tbl1pk PRIMARY KEY (item1)
)

【仕様】
1.テーブル内の特定の1レコードを取得

2.取得したレコードをVBの画面に表示

3.入力:VBの画面で item2 の表示内容を変更

4.ボタン入力
4-1.レコードが存在しない場合
 メセージボックスに「誰かが消した」と表示

4-2.タイムス...続きを読む

Aベストアンサー

> Npgsqlではフェッチは使えないのでしょうか?
できますよ。
http://msdn.microsoft.com/ja-jp/library/9kcbe65k(v=vs.110).aspx

別にNpgsqlに限った話ではなく、こういうライブラリはよっぽど独自
実装してない限り、大抵DbCommand、DbDataReaderを使うのと一緒です。

継承元クラスを直接利用するならば、
Dim con As NpgsqlConnection ' コネクションがある前提
Dim command As NpgsqlCommand = con.CreateCommand()
Dim r As NpgsqlDataReader = command.ExecuteReader()
Do While r.Read()
 Console.WriteLine(r.GetString(0))
Loop
r.Close()
command.Dispose()

こんな感じに。

DB操作がわからないなら、System.Data.Common内のクラスを見るなり、
それぞれのメソッドを見るなり、他サイトでクラスやメソッド単位で調べるなり
すれば解決すると思います。
Npgsqlのクラスのほとんどは、このクラスを継承して実装が行われています。
http://msdn.microsoft.com/ja-jp/library/System.Data.Common(v=vs.110).aspx

Npgsqlのクラス名を知りたければ、CHMファイルがあります。
http://pgfoundry.org/frs/?group_id=1000140

> Npgsqlではフェッチは使えないのでしょうか?
できますよ。
http://msdn.microsoft.com/ja-jp/library/9kcbe65k(v=vs.110).aspx

別にNpgsqlに限った話ではなく、こういうライブラリはよっぽど独自
実装してない限り、大抵DbCommand、DbDataReaderを使うのと一緒です。

継承元クラスを直接利用するならば、
Dim con As NpgsqlConnection ' コネクションがある前提
Dim command As NpgsqlCommand = con.CreateCommand()
Dim r As NpgsqlDataReader = command.ExecuteReader()
Do While r.Read()
 Console.Write...続きを読む

Q梨花のYさん??

さっきテレビで梨花に向かって「某サッカー選手のYさん」と言っていました。Yさん…?これって梨花の彼氏のことですかね?柳沢さん…?wどなたか知ってたら教えて下さい。

Aベストアンサー

それは日本代表の柳沢敦選手ですね。
柳沢選手は現在、結婚していますがその奥さんの前に付き合っていたのが梨花です。確か4,5年前だったと思います。
私もバラエティー番組でその事をネタにされている梨花を何度か見たことがあります(笑)

ちなみに柳沢選手と付き合っていた女性はモデルが多いみたいですよ。奥さんも現役モデルです。
そしてつい先日、合コンでお持ち帰りをしてしまったコトがニュースになってしまい、東アジア選手権への出場を断念されました。

QpostgreSQLで更新後のデータを取得したい。

postgreSQLで更新後のデータを取得したい。

初めて質問させていただきます。

postgreSQLでupdateした後、更新後のデータをselectで取得したいのですが、
トランザクションが完了するまでにselect文が発行されているみたいで、更新前のデータを取得してしまいます。

それぞれ、違うファイルから投げられているので、同じトランザクションにすることはできません。

何かいい方法があればご教授お願いします。


a.phpで下記のSQLを発行

update
test_tbl
set
test1 = 'aaa'
where
test2 = 'bbb'

a.phpが走っている間に、下記のb.phpが実行される。

select
test1
from
test_tbl

環境
php5
postgres8.1

Aベストアンサー

2個提案します。

1.Aでupdateする前にcvs形式でファイル保存して、Bではselectせずにcvsを見に行く。

ただ、1レコードならいいですけど、膨大なレコードの場合
考え物だと思います。

2.Bでselectする時にFOR UPDATEをつければAが更新中だったら
更新が終わるのを待ってからselect出来ると思います。

ただ、Aが数秒おきに行われるということなので、
Bのselectが終わったらすぐにロックを解除しないとAが数秒間
止まる可能性を考えなければなりません。

Q梨花さん?!

やしきたかじんさんが司会の番組で梨花さんにそっくりな女性タレントさんがいました.
やはりハーフっぽい感じで,一見モデルさんの様ですが・・・

どなたかご存知の方教えて下さい<(_ _)>
梨花さんとは関係があるのかも良かったら教えて下さい!

Aベストアンサー

この方でしょうか?最近よくテレビに出演していて、日テレのラジかるという番組のレギュラーもやっていますが。。

参考URL:http://www.horipro.co.jp/talent/PF082/

Qwindows環境でのpostgreSQL

windowsXP
Apache2.0.54
PHP5.0.4
という環境なんですが、付き合いでPHP5とpostgreSQLを使ったシステムを頼まれました。
相手の環境はwindowsではなくLinuxらしいので、こちらも同じ環境で開発するのが理想だとは思うのですが、windows環境で開発する事も可能なのでしょうか?
PHPからpostgreSQLへの接続をしてIDが返ってくるまでは出来るものの、テーブルへのアクセスが出来ないなどの事例がありまして少し不安に思っています。
突然の質問で恐縮なのですが、この不安を少し取り除くのに協力して頂けないでしょうか?
よろしくお願いいたします。

Aベストアンサー

いっその事、VMWare Playerやqemuなどのエミュレータを使って、仮想Linux環境を作った上で開発してみては。

参考URL:http://www.atmarkit.co.jp/flinux/rensai/linuxtips/638knoppixwqemu.html

Q梨花さんのワンピースの名前

梨花さんがTVでよく着ているふわっとしたワンピースってなんて言うんですか?
胸の下でキュッと絞っててふんわりした感じです。
あぁいうワンピースがほしくてネットで探していますが、
なかなかなくて・・・。
ちなみに梨花さんのはどこのブランドかご存知の方が
いらっしゃったら教えてください!

Aベストアンサー

こんにちは☆
梨花さん、かわいいですよね。
最近はバラエティーが目立ちますけど、
雑誌で見るモデル姿はやっぱりかわいいですね。

早速ですが、ワンピはたぶん「ベビードール」って
言われるものだと思います☆

私も大好きでよく着てます☆
カジュアルにしたいときはデニムでも合うし、
可愛くしたいときはそのままでミュールやスニーカーも可愛いし。
て感じですね。

最近は妊婦さんなどもよく着てらっしゃいますしね。

お店としては梨花さんがどこのを着ているかまでは
わかりませんが。アナスイやジルスチュアート、
キャシャレル、シンシアローリーなどに結構あるように思います☆

でも、同じ様な形でも試着して見ないと合うものと合わないものがあるので、
必ず試着はした方が良いかもです。
同じブランドでも、ちょっとした形の違いで
似合うものと似合わないものが合ったりするので・・・。

また探してみてください☆
良いのが見つかると良いですね☆

QUPDATE文について

昨日こちらで自分の間違ったSQL文をご指摘頂き
時間計算の処理は実装する事が出来たのですが
その後の計算処理が終わった後、計算結果をDBに格納する処理で
再度躓いてしまったので、再度のご教授お願いします。

$sql = "SELECT SUM(ROUND(労働時間/100, 0)) + ROUND(SUM(MOD(労働時間,100)) / 60, 2) AS total
    FROM 労働時間テーブル WHERE id = 'ログインしている人のID';";
$total_Time = pg_query($con, $sql);
$total_Time = pg_fetch_result($total_Time, 0, 'total');

// 確認のため、表示
echo $total_Time;

で値はきちんと表示されおります。
しかし、この後UPDATE文で
$sql = "UPDATE 労働時間テーブル SET 総労働時間 = '$total_Time' WHERE id = 'ログインしている人のID';";
pg_query($con, $sql);

と打ち試しましたが、echoの時に表示された値がDBに格納されません。(>_<)

試しに
$sql = "UPDATE 労働時間テーブル SET 総労働時間 = '$total_Time' WHERE id = 'ログインしている人のID';";
の'$total_Time'をSELECT文に変更したりもしましたが、echoの時に
表示されていた値とは違う値がDBに格納されるようになってしまいました。

どのように解決したらよいか、悩んでおります。
そもそもの考え方から間違っているのでしょうか?

ご教授の程、よろしくお願い致します。

昨日こちらで自分の間違ったSQL文をご指摘頂き
時間計算の処理は実装する事が出来たのですが
その後の計算処理が終わった後、計算結果をDBに格納する処理で
再度躓いてしまったので、再度のご教授お願いします。

$sql = "SELECT SUM(ROUND(労働時間/100, 0)) + ROUND(SUM(MOD(労働時間,100)) / 60, 2) AS total
    FROM 労働時間テーブル WHERE id = 'ログインしている人のID';";
$total_Time = pg_query($con, $sql);
$total_Time = pg_fetch_result($total_Time, 0, 'total');

// 確認のため、...続きを読む

Aベストアンサー

PostgreSQLよりも、PHPの記述に問題があるような気がします。
たとえば、
$total_Time = pg_query($con, $sql);
$total_Time = pg_fetch_result($total_Time, 0, 'total');
の部分は、本来別ものの値を扱うのに、$total_Time という名前の変数を使いまわしていますが、
$res = pg_query($con, $sql);
$total_Time = pg_fetch_result($res, 0, 'total');
というように分けて書いたほうが混乱がありません。


本題ですが、echo $sql; はどうなっておりますでしょうか。

もし、$total_Timeで差し込んだ部分が、空になっているなら、
""内に直接変数を置いているため正常に認識されないのかもしれません。
$sqlは、あくまでも文字列ですので、
ここは、"もじれつ".$hensu のように . で文字列連結をするほうが安全です。
「総労働時間」列のデータ型が数値なら
$sql = "UPDATE 労働時間テーブル SET 総労働時間 = ".$total_Time." WHERE id = 'ログインしている人のID';";
文字列なら
$sql = "UPDATE 労働時間テーブル SET 総労働時間 = '".$total_Time."' WHERE id = 'ログインしている人のID';";
かと思います。

PostgreSQLよりも、PHPの記述に問題があるような気がします。
たとえば、
$total_Time = pg_query($con, $sql);
$total_Time = pg_fetch_result($total_Time, 0, 'total');
の部分は、本来別ものの値を扱うのに、$total_Time という名前の変数を使いまわしていますが、
$res = pg_query($con, $sql);
$total_Time = pg_fetch_result($res, 0, 'total');
というように分けて書いたほうが混乱がありません。


本題ですが、echo $sql; はどうなっておりますでしょうか。

もし、$total_Timeで差し込んだ...続きを読む


人気Q&Aランキング

おすすめ情報