tags:

views:

37

answers:

3

I want to create some mad robust code. I want to take a query as a string, create a temporary view / table to store the results, use it, then drop the table. I want to use a name that is guaranteed to not already exist in the database. Is there an SQL command to generate a unique table name? I'm using postgresql if this is implementation-specific.

+2  A: 

I don't know a SQL command to do that but you could just generate one kind of like generating a temp filename: put in the date, some random number, process ID, user's birthday: $table_name = join("_", "temp", $$, rand()*0x1000, time)

In all SQL databases I've used, each session has its own namespace of temporary tables. So you can just create a temp table called "foo" and not worry about it clashing with another thread doing the same thing (on a different connection!). In Oracle, this is specifically a "LOCAL temporary table"- whereas a "GLOBAL temporary table" is seen by all sessions: but only its schema, not its data. In MSSQL, table names are internally bodged to be distinct, but constraint names aren't (are weren't as of SQL Server 2000).

araqnid
All PostgreSQL temporary tables are LOCAL; you can specify them as GLOBAL, but that doesn't actually do anything.
Greg Smith
A: 

I don't know postgres very well, but could you do (excuse the pseudo-code):

SET @name = GetBigRandomNumber();

WHILE TableExists(@name)
BEGIN
    SET @name = GetBigRandomNumber();
END
Paul
+2  A: 

You could use a temporary table. Temporary tables are invisible to other connections. If a permanent table with the same name as the temporary table exists, the permanent table is invisible to the current connection.

CREATE TEMPORARY TABLE table_name  
(  
 column_name1 data_type(length) constraints,  
 column_name2 data_type(length) constraints,  
 ...

See the PostgreSQL manual page.

Andomar
yep this seems like the right way to go
Claudiu