環境は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&Aを探す

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

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

QMAX値を条件にデータを取得するには?

SQL文で困っています。
ご教授下さい。


下記のようなデータがあった場合、それぞれの区分毎に
年月が最大(最新)のデータを取得したいです。
(実際には1レコードにその他項目があり、それらも取得します。)
<検索対象データ>
区分 年月   金額
-----------------------------
A   200412  600
A   200503  560
B   200311  600
B   200508  1000
B   200504  560
C   200508  400
C   200301  1100


<取得したいデータ>

区分 年月   金額
-----------------------------
A   200503  560
B   200508  1000
C   200508  400

よろしくお願いします。

Aベストアンサー

テーブル名をXXXとすると次のようなSQLでよいと思います。(最善の方法かどうかは自信がないですが)

select B.* from (select 区分, max(年月) as 年月 from XXX group by 区分) As A
inner join XXX as B on A.区分 = B.区分 and A.年月 = B.年月
order by B.区分

QPostgreSQLで表結合+DELETEしたい

PostgreSQLで、テーブル(2)の情報をキーに(1)を削除したいのですが、エラーが出てしまいます。
どなたか解決策をご存知の方いらっしゃいましたら
ご教授宜しくお願い致します。

_構造_____________________
テーブル(1)・・カラムA
テーブル(2)・・カラムA、カラムB

_SQL文_____________________
DELETE
FROM (1)
INNER JOIN (2) ON (1).カラムA= (2).カラムA
WHERE (2).カラムB=X

_エラーメッセージ__________
[Err] ERROR: syntax error at or near "INNER"

Aベストアンサー

PostgreSQLではDELETE文の拡張構文として「USING」が使えます。

DELETE
FROM (1)
USING (2)
WHERE (1).カラムA= (2).カラムA
AND (2).カラムB=X

マニュアルを参照してください。
http://www.postgresql.jp/document/9.0/html/sql-delete.html

QUPDATE時のSETの実行順について

MySQLで
  UPDATE data SET item1=item2, item2=0;
と書いた場合、item1にはそれまでのitem2の値が入り、item2は0になりました。

また、
  UPDATE data SET item2=0, item1=item2;
と書いた場合、item1、item2ともに0になりました。

これは「SETの内容は、書いた順に実行されることが保証されている」と考えてよいのでしょうか?
それとも実装依存なのでしょうか?

Aベストアンサー

マニュアルに

mysql> UPDATE persondata SET age=age*2, age=age+1;
UPDATE は左から右へ評価されます。

とありますので、書いた順に実行されるということだと思います。
http://dev.mysql.com/doc/mysql/ja/UPDATE.html#IDX1545

参考URL:http://dev.mysql.com/doc/mysql/ja/UPDATE.html#IDX1545

Qcastの使用法について(初心者です)

始めまして。初心者ですので基本的な質問になるかもしれませんがよろしくお願いします!

なぜかPostgreSQLを仕事に使うことになり、四苦八苦しています。

テーブルを作成しているときに、
create table syouhin (shinamono text, nedan int);
とするとします。
で、insert でデータを入れていきますが、
例:
shinamono | nedan
------------------
みかん |100
マンゴー |200

例えば、nedan のcast が今、int にしましたが、これをchar やfloatに変えたいときはどうすればよろしいのでしょうか?

どなたか御存じの方、お手数ですがお教え下さい!!!

Aベストアンサー

CAST関数の文法は、CAST(○ AS △) となります。
○:変換する値
△:変換する型

Select CAST(nedan AS char(10)) ~
とすればできると思いますよ

QUPDATE文のWHERE条件に他のテーブルのフィールドも入れたい

SQL文についてです。

表Aで列1と列2が'◎'のものについて、列3,列4,列5をそれぞれ'○','△','×'に更新したい場合は下記でOKだと思います。
UPDATE 表A
SET 列3 = '○', 列4 = '△', 列5 = '×'
WHERE 列1 = '◎' AND 列2 = '◎'

列1と列2をキーとして表Aと結合できる表Bが存在するとします。
条件に表Bの列6が'□'だった場合を追加したい時、どのような方法で行えば良いのでしょうか?
内部結合やWHERE EXISTSなどをいろいろ調べたのですが、SQL文に慣れていないためかうまくいきません。
初歩的な質問で申し訳ありませんが過去質問で参考になるものがなかったのでお願いします。

Aベストアンサー

UPDATE 表A
SET 列3 = '○', 列4 = '△', 列5 = '×'
WHERE 列1 = '◎' AND 列2 = '◎'
AND EXISTS
( SELECT 1 FROM 表B
WHERE 表B.列1 = 表A.列1
AND 表B.列2 = 表A.列2
AND 表B.列6 = '□' )
じゃだめですか。

Q配列に指定した値が含まれているものを抽出する方法

こんにちは。
いつもお世話になっております。

SQLにて、配列のフィールドに指定した値が含まれているものを抽出する方法を質問致します。


SQLのテーブル(テーブル名:data)に配列のフィールド(フィールド名:array[])があるとします。
Array[]フィールドの中に、1, 2, 6のいずれかが含まれている場合表示対象となるSQL文を書くには、どのように書けばよいですか。PostgreでSQL文を書くとします。


実現したい動作は以下の通りです。
array[] の値
{1,3,5} 表示対象になる
{3,8,9,10}  表示対象にならない
{2,6} 表示対象になる

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


ちなみに、array[]フィールドの中に、2(指定した数値が1つだけ)を探すとき、
select * from data where 2=any (array);
とすればいいことは確認できました。

Aベストアンサー

&& 演算子 (重複する, 共通要素を持つ) を使います。

SELECT * FROM (VALUES
(ARRAY[1,3,5]),
(ARRAY[3,8,9,10]),
(ARRAY[2,6])
) T(arr)
WHERE ARRAY[1,2,6] && arr;

参考URL:http://www.postgresql.jp/document/current/html/functions-array.html

Q「いずれか」と「いづれか」どっちが正しい!?

教えて下さいっ!
”どちらか”と言う意味の「いずれか」のかな表記として
「いずれか」と「いづれか」のどちらが正しいのでしょう???

私は「いずれか」だと思うんですが、辞書に「いずれか・いづ--。」と書いてあり、???になってしまいました。
どちらでもいいってことでしょうか?

Aベストアンサー

「いずれか」が正しいです.
「いづれ」は「いずれ」の歴史的かな遣いですので,昔は「いづれ」が使われていましたが,現代では「いずれ」で統一することになっていますので,「いずれ」が正しいです.

Qtimestampのデータはどのようにして入力

するのでしょうか?

create table tablex(no serial primary key,time timestamp);

insert into tablex(time) values(?);

において?の部分に入れる文字列のフォーマットはどうなるのでしょうか?

例えば
2005年5月5日5時55分55秒
を入れるにはどうしたらいいのでしょうか?

Aベストアンサー

'2005-05-05 05:55:55'

Qシェルコマンドの 2>&1 とはどういう意味でしょうか?

command > /dev/null 2>&1

というコマンドがありましたが意味がわからないので教えてください。
> /dev/null
部分は、出力を捨てるということだと思いますが、
2>&1
部分がわからないです。

Aベストアンサー

Unix ではファイル記述子というのがあって、番号、多くの場合 0, 1, 2 が使われます。0は入力、1は普通のメッセージ出力、2はエラーメッセージの出力というように使い分けされています。

さて、ご質問ですが、command > /dev/null という部分は、command の普通のメッセージ(ファイル記述子1番)を /dev/null というファイル(このファイルは特殊で、ここに出力された内容は全て捨てられます)に出力されます。で、残る "2>&1" という部分ですが、これは2番のファイル記述子を1番というファイル記述子にする、という意味になります。

従いまして、"command > /dev/null 2>&1" とすることで command からの全てのメッセージは(/dev/nullに)捨てられる、つまり、エラーがあろうがなかろうが出力されるメッセージは何もないことになります。

Qリンクをクリックした時にformからPOST送信したい。

HTML、PHP、JavaScript等でサイトを作っているのですが・・・。

【実現出来ている例】
<form name="form1" method="post" action="Next.php" onSubmit="return InputCheck()">
 <input type="submit" value="送信">
</form>
 submitボタンを一つ置いて、それがクリックされた場合に
formの内容をPOSTで送信する。

【実現したい例】
<form name="form1 method="post">
 <a href="Next.php" onClick="???">???</a>
</form>
 formの中のリンクをクリックされた場合に、formの内容を
POSTで送信したいのですが、その実現方法がわかりません。
GETで送るという手もあり得ますが、今回はどうしてもPOST
したいのですが。

Aベストアンサー

<form name="form1" method="post" action="Next.php">
<a href="#" onClick="document.form1.submit();">???</a>
</form>

onclick内の対象がform1としてあてているので、
アンカータグは別にform内に記述しなくても大丈夫です

form内にhidden等でnameとvalueを持ったパラメータがあればそれも送られます

アンカータグから動的にvalueを変更したい場合は、
document.form1.hogename.value = 'hoge';
等をsubmit()の前に行えば可能です

ただしform内に
<input type="hidden" name="hogename" value="">
を記述する等、変更先パラメータの元を用意する必要がありますのでご注意下さい


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報