2010-07-13 2 views
2

Je ne suis pas sûr de savoir comment la phrase, mais ici ... Nous avons une structure de table comme ce qui suit:Ajout d'une contrainte unique sur la valeur calculée d'une colonne

Id | Timestamp | Type | Clientid | ..others.. 
001 | 1234567890 | TYPE1 | CL1234567 |.....  
002 | 1234561890 | TYPE1 | CL1234567 |.....  

Maintenant, pour la données données ci-dessus ... Je voudrais avoir une contrainte pour que ces 2 lignes ne puissent pas exister ensemble. Essentiellement, je veux que la table soit

Unique for (Type, ClientId, CEIL(Timestamp/10000)*10000) 

Je ne veux pas de lignes avec les mêmes données créées dans le temps X de l'autre à ajouter à la DB, i.e. voudrait une violation de contrainte dans ce cas. Le problème est que la contrainte ci-dessus n'est pas quelque chose que je peux réellement créer.

Avant de demander, je sais, je sais ... pourquoi pas? Eh bien, je sais qu'un certain scénario ne devrait pas se produire, mais hélas c'est le cas. J'ai besoin d'une sorte de mesure d'écart pour l'instant, donc je peux prendre le temps d'enquêter sur le sujet. Faites-moi savoir si vous avez besoin d'informations supplémentaires ...

Répondre

8

Oui, Oracle prend en charge les colonnes calculées:

SQL> alter table test add calc_column as (trunc(timestamp/10000)); 

Table altered. 

SQL> alter table test 
    add constraint test_uniq 
    unique (type, clientid, calc_column); 

Table altered. 

devrait faire ce que vous voulez.

+0

Problème similaire à celui-ci, mais si je dois ajouter une nouvelle colonne, cela ressemble à la façon de procéder. J'aime l'idée d'utiliser trunc au lieu de ce que je faisais (1 moins math op). Maintenant, pour voir si les gens db trouvent cela copacétique. –

1

AFAIK, Oracle ne prend pas en charge les colonnes calculées comme le fait SQL Server. Vous pouvez imiter la fonctionnalité d'une colonne calculée à l'aide de déclencheurs.

Voici les étapes à suivre pour ce

  1. Ajouter une colonne appelée CEILCalculation à votre table.
    • Sur votre table, mettez un déclencheur mettra à jour CEILCalculation avec la valeur de CEIL(Timestamp/10000)*10000
    • Créer un index unique sur les trois colonnes (Unique for (Type, ClientId, CEILCalculation)

Si vous ne voulez pas modifier la table structure, vous pouvez mettre un BEFORE INSERT TRIGGER sur la table et vérifier la validité là-bas.

http://www.techonthenet.com/oracle/triggers/before_insert.php

+0

Thx pour l'info rapide ... J'ai pensé à cela aussi ... Je voudrais éviter d'ajouter des colonnes, etc., et de trop modifier le schéma. Le problème est que la table est gigantesque et souvent utilisée/mise à jour –

Questions connexes