2
votes

Comment concevoir une table avec 3 clés primaires composées

J'ai une table avec les colonnes Formulaire, Évaluateur, Date et Niveau

Un formulaire ne peut jamais avoir les mêmes évaluateurs, et un formulaire ne peut jamais avoir les mêmes niveaux.

J'ai essayé de créer une clé primaire (formulaire, évaluateur) et une clé primaire (formulaire, niveau) mais cela dit que le formulaire a plusieurs clés primaires

Si je mets une clé primaire (formulaire, évaluateur, niveau) les gens peuvent simplement insérer le même formulaire et le même évaluateur deux fois, mais avec un niveau différent et cela enfreint mes règles.

       |Form|Appraiser|Level|
         1       A       1
         1       B       2
         1       C       3
         2       A       1
         2       B       2
         2       C       3


6 commentaires

On dirait que vous voulez des contraintes uniques plutôt que des clés primaires.


@jarlh oh ok merci d'avoir travaillé, y a-t-il un avantage à utiliser des clés primaires composées par rapport aux clés uniques composées?


@jarlh Mais si deux formes différentes pouvaient avoir le même évaluateur ou niveau, alors une contrainte unique en elle-même ne fonctionnerait pas.


@TimBiegeleisen salut désolé je pense que j'ai un peu de malentendu sur ma question, c'est en fait un évaluateur ne peut jamais avoir le même niveau sous une seule forme, donc ce que je voulais vraiment mettre était la clé primaire (formulaire, évaluateur) et la clé primaire (formulaire , évaluateur, niveau)


Veuillez ajouter quelques exemples de données.


@TimBiegeleisen a ajouté, j'ai omis la date. Donc, fondamentalement, un formulaire a des évaluateurs de différents niveaux, le niveau détermine s'ils sont le premier, le deuxième ou le troisième évaluateur


3 Réponses :


1
votes

Nous pouvons essayer d'utiliser deux tables de jonction ici:

CREATE TABLE form_appraiser (
    form_id INTEGER NOT NULL,
    appraiser_id INTEGER NOT NULL,
    PRIMARY KEY (form_id, appraiser_id)
);

CREATE TABLE form_level (
    form_id INTEGER NOT NULL,
    level_id INTEGER NOT NULL,
    PRIMARY KEY (form_id, level_id)
);

Chacune de ces deux tables garantirait qu'un formulaire donné ne peut être associé qu'à un seul évaluateur ou niveau.

Ensuite, maintenez une troisième table forms contenant un enregistrement pour chaque formulaire unique. Si vous avez l'exigence supplémentaire qu'un formulaire donné ne peut avoir qu'un seul évaluateur ou niveau, ajoutez une contrainte unique sur le formulaire, sur l'une / les deux tables de jonction.


0 commentaires

0
votes

Vous pouvez essayer d'ajouter la contrainte unique comme identificateur de colonne.

comme

évaluateur VARCHAR (50) UNIQUE, forme VARCHAR (50) UNIQUE, niveau VARCHAR (50) UNIQUE,

Dans ce cas, aucune des valeurs ne se répète. Si vous voulez qu'une combinaison de valeurs ne se répète pas, vous pouvez utiliser UNIQUE (forme, niveau) Cela signifie que vous ne pouvez pas avoir une forme de répétition de même niveau.


0 commentaires

1
votes

Je pense que vous pourriez utiliser: -

INSERT OR IGNORE INTO mytable values (1,'Z',1)
> Affected rows: 0
> Time: 0s

par exemple Utilisation de ce qui suit

INSERT OR IGNORE INTO mytable VALUES (1,'A',4)
> Affected rows: 0
> Time: 0s

Les résultats sont: -

INSERT INTO mytable VALUES
                (1,'A',1),(1,'B',2),(1,'C',3),
                (2,'A',1),(2,'B',2),(2,'C',3)
> Affected rows: 6
> Time: 0.083s
  • tous ajoutés

mais

DROP TABLE IF EXISTS mytable;
CREATE TABLE IF NOT EXISTS mytable (form INTEGER, appraiser TEXT, level INTEGER, UNIQUE(form,appraiser), UNIQUE(form,level));
INSERT INTO mytable VALUES
                (1,'A',1),(1,'B',2),(1,'C',3),
                (2,'A',1),(2,'B',2),(2,'C',3)
;
INSERT OR IGNORE INTO mytable VALUES (1,'A',4);
INSERT OR IGNORE INTO mytable values (1,'Z',1);
  • non ajouté car A a déjà approuvé le formulaire 1.

et aussi

CREATE TABLE IF NOT EXISTS mytable (form INTEGER, appraiser TEXT, level INTEGER, UNIQUE(form,appraiser), UNIQUE(form,level));
  • non ajouté car pour 1 a déjà été évalué au niveau 1


0 commentaires