2012-10-10 2 views
0

J'ai effectué beaucoup de recherches mais je n'ai pas trouvé de réponse à ma requête. Ce que je vous demande ne peut pas être possible cependant:Valeur d'incrémentation par défaut dans la table postgresql

J'ai une série de tableaux, mais pour simplifier supposons que je donne les résultats suivants

Article articleId SÉRIE

ArticlePageNumber articleId/références article .articleId/ pageNumber Int

Ceci est assez explicite toutefois, les données thatwould acceptable serait

Article 
------- 
articleiId 
1 
2 

ArticlePageNumber 
----------------- 
articleiId pageNumber 
1   1 
1   2 
1   3 
1   4 
1   5 
1   6 
2   1 
2   3 
2   5 
2   2 
2   4 

Une table inacceptable serait ArticlePageNumber

ArticlePageNumber 
----------------- 
articleiId pageNumber 
1   1 
1   1 
1   2 
1   3 
1   4 
1   5 
2   1 
2   3 
2   5 
2   4 

je voudrais la valeur par défaut pour ArticlePageNumber.pageNumber à incrémenter similaire à la façon dont série ne porte toutefois que la prochaine valeur dépendra de la valeur précédente (ou 1 si aucun) pour les entrées avec cet articleId particulier.

Je préférerais faire cela en tant que contraintes et vérifications au sein de SQL plutôt que ce code mais je suppose que ce ne serait peut-être pas possible.

+1

Peut-être semblable à http://stackoverflow.com/questions/12746106/how-to-create-multiple-sequences-in-one-table/12746929 – jcern

+0

@jcern sur l'examen de l'autre question que vous êtes tout à fait raison Il y a un peu de similitude et quelques suggestions peuvent résoudre mon problème. Je vous remercie. – Peter

Répondre

2

Le comportement que vous avez besoin est pas impossible, mais il est délicat:

Facile à réaliser - une séquence de numéro de page qui ne sait pas ce que l'article il est attaché à

D'abord, créer une séquence pour les numéros de page comme suit:

CREATE SEQUENCE page_number_sequence; 

Si vous devez régler la taille d'allocation, etc commencer look here

Puis: lors de la définition de la table « article_page_number », définissez le champ pageNumber comme suit:

# omitted boilerplate 
pageNumber integer not null default nextval('page_number_sequence') 

qui remplira automatiquement pour vous les numéros de page d'une manière incrémenter. Si vous ne voulez pas de numéros de séquence "gappy", définissez l'incrément sur 1 (par défaut) et le cache sur 1 (par défaut) lors de la configuration de la séquence.

plus délicate - une séquence de numéro de page autoincrementing qui est au courant de l'article

Vous pouvez utiliser une par ligne déclencheur qui écoute les enregistre sur la table de numéro de page de l'article et:

  • Vérifie si une séquence spécifique à cet article existe et la crée n'existe pas
  • Affecte un numéro de page de cette séquence s'il n'en existe pas

Le code ci-dessous a seulement subi des tests de lumière, mais il devrait illustrer la pensée ...

CREATE TABLE IF NOT EXISTS article (
    articleId SERIAL PRIMARY KEY 
); 

CREATE TABLE IF NOT EXISTS article_page_number (
    articleId INTEGER NOT NULL, 
    pageNumber INTEGER NOT NULL, 
    CONSTRAINT article_fk FOREIGN KEY (articleId) 
     REFERENCES article (articleId) 
); 

CREATE OR REPLACE FUNCTION page_number_trg() 
    RETURNS trigger AS 
$BODY$ DECLARE 
    seqname VARCHAR(60):= NULL; 
BEGIN 
    IF (TG_OP = 'INSERT') THEN 
    BEGIN 
     seqname:= 'pageno_seq_'||NEW.articleId; 
     IF NOT EXISTS (SELECT 0 FROM pg_class where relname = seqname) THEN 
     EXECUTE 'CREATE SEQUENCE '||seqname; 
     END IF; 
     IF NEW.pageNumber IS NULL THEN 
     NEW.pageNumber := nextval(seqname); 
     END IF; 
    END; 
    END IF; 
    IF TG_OP = 'DELETE' THEN RETURN OLD; ELSE RETURN NEW; END IF; 
END 
; $BODY$ 
LANGUAGE plpgsql; 

CREATE TRIGGER page_number_trg 
BEFORE INSERT ON article_page_number 
FOR EACH ROW 
EXECUTE PROCEDURE page_number_trg(); 
Questions connexes