-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
On 2001 November 27 09:11 am, Gyorgy Molnar wrote:
> I need to store some incoming data and retrieve them one by one (LIFO).
> Different processes will manage the storage and the retrieval.
> How can I retrieve only the first row from a table?
DROP TABLE queue; DROP SEQUENCE queue_id_seq;
CREATE TABLE queue (id SERIAL UNIQUE, data TEXT);
- -- to insert into queue
INSERT INTO queue (data) VALUES ('first');
INSERT INTO queue (data) VALUES ('second');
- -- to remove from queue
BEGIN;
LOCK queue IN EXCLUSIVE MODE;
SELECT * FROM queue ORDER BY id LIMIT 1;
DELETE FROM queue WHERE id = 1; -- use the id retrieved above
COMMIT;
Key features:
- - the SERIAL data type draws it's values from a SEQUENCE, which allows us to
easily maintain the order of the queue.
- - by marking it UNIQUE, we have implicitly defined an index on the column,
which will make the ORDER BY clause in the SELECT and the WHERE clause in the
DELETE more efficient.
- - wrapping the whole thing in a transaction and using a LOCK should ensure
correct behaviour in a concurrent situation.
- --
Andrew G. Hammond mailto:drew@xyzzy.dhs.org http://xyzzy.dhs.org/~drew/
56 2A 54 EF 19 C0 3B 43 72 69 5B E3 69 5B A1 1F 613-389-5481
5CD3 62B0 254B DEB1 86E0 8959 093E F70A B457 84B1
"To blow recursion you must first blow recur" -- me
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.0.6 (GNU/Linux)
Comment: For info see http://www.gnupg.org
iEYEARECAAYFAjwFVTsACgkQCT73CrRXhLHEJQCeNVW/3xh/PTfuRsykUz8+ff55
vVEAniFOBIC4FBEeKFwYKN103YbKXFyd
=WMz8
-----END PGP SIGNATURE-----