2010-06-08 6 views
2

Je veux créer du code robuste et fou. Je veux prendre une requête sous forme de chaîne, créer une vue/table temporaire pour stocker les résultats, l'utiliser, puis déposer la table. Je souhaite utiliser un nom dont la présence dans la base de données n'est pas garantie. Y a-t-il une commande SQL pour générer un nom de table unique? J'utilise postgresql si c'est spécifique à l'implémentation.sql génère un nom de table/vue unique

Répondre

4

Vous pouvez utiliser une table temporaire. Les tables temporaires sont invisibles pour les autres connexions. Si une table permanente portant le même nom que la table temporaire existe, la table permanente est invisible pour la connexion en cours.

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

Voir PostgreSQL manual page.

+0

Eh oui, cela semble être la bonne façon d'aller – Claudiu

+0

la limite est que ce n'est pas unique pour la transaction en cours. Par exemple, si vous créez une table temporaire à partir d'une fonction, vous ne pouvez pas appeler cette fonction plus d'une fois par transaction. –

2

Je ne sais pas une commande SQL pour le faire, mais vous pouvez simplement générer un peu comme la génération d'un nom de fichier temp: mettre la date, un nombre aléatoire, ID de processus, anniversaire de l'utilisateur: $table_name = join("_", "temp", $$, rand()*0x1000, time)

En toutes les bases de données SQL que j'ai utilisées, chaque session a son propre espace de noms de tables temporaires. Vous pouvez donc simplement créer une table temporaire appelée "foo" et ne pas vous inquiéter de la collision avec un autre thread faisant la même chose (sur une connexion différente!). Dans Oracle, il s'agit spécifiquement d'une "table temporaire LOCAL" - alors qu'une "table temporaire GLOBAL" est vue par toutes les sessions: mais seulement son schéma, pas ses données. Dans MSSQL, les noms de tables sont codés en interne pour être distincts, mais les noms de contrainte ne le sont pas (ils ne l'étaient pas à partir de SQL Server 2000).

+1

Toutes les tables temporaires PostgreSQL sont LOCAL; vous pouvez les spécifier comme GLOBAL, mais cela ne fait rien. –

0

Je ne sais pas postgres très bien, mais pourriez-vous faire (excusez le pseudo-code):

SET @name = GetBigRandomNumber(); 

WHILE TableExists(@name) 
BEGIN 
    SET @name = GetBigRandomNumber(); 
END 
Questions connexes