WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:データベースのレコード削除

0:[投稿] ニタ [2004/03/01 10:28 ][環境:Windows2000 Linux]

データベースvaltable
1500,1280,35460874368
1600,1400,26846840843
2800,2500,98013980398

最後のフィールドがユニークIDであることを利用してテーブルの最後のレコードを削除します。
最後のレコードを得て、その最後のフィールドの値を持っているレコードを消します。
$rownum = pg_numrows($res);
$rowdat = pg_fetch_row($res,$rownum-1);
$resstr = 'delete from valtable where unival = ' . $rowdat[2];

これでデータベースvaltableは
1500,1280,35460874368
1600,1400,26846840843
のようになりました。

$resstr = 'delete from valtable ROW NUMBER = ' . $rownum-1;

のように、レコード数を指定して削除するにはどう書けばよいですか?
ここに書いたものはイメージです。


1:[回答] ふじ [2004/03/01 14:33 ]

# DB は PostgreSQL で言語は PHP、ということでよろしいですか?
# 使えるSQLは PostgreSQL のバージョンによって異なりますので、バージョン
# も示してください。

まず、「最後のレコード」の定義は何でしょうか。
一般に SELECT を ORDER 句なしで発行した場合に返されるレコードの並び順は
不定ですから、上記例で単に
SELECT * FROM valtable;
とした場合、
2800,2500,98013980398
の行が最後になるとは限りません。

何らかの ORDER 句を付けて「最後のレコード」が一意に定まるようにする必要があります。

たとえば、 ORDER BY unival とすれば、unival がもっとも大きいものが
最後に来ます(unival が数値型だとして)。
(以下この仮定の下に)
unival が大きいものから x行 SELECT するには
SELECT * FROM valtable ORDER BY unival LIMIT x;
ですから、
DELETE FROM valtable WHERE unival IN (SELECT unival FROM valtable ORDER BY unival LIMIT 2);
とすれば、unival が大きいものから2行削除されます。

長々と書きましたが、
・PostgreSQLのバージョン
・「最後のレコード」の定義
を示していただけなければ、正確な回答はできません。


2:[回答] ふじ [2004/03/02 17:54 ]

> SELECT * FROM valtable ORDER BY unival LIMIT x;
> DELETE FROM valtable WHERE unival IN (SELECT unival FROM valtable ORDER BY unival LIMIT 2);
すみません間違いました。

ORDER BY unival DESC

でないと、「大きいほうから」になりません。

回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]

ChaichanPAPA's World