2010-12-07 5 views
2

i ont une table commeest-il possible d'avoir un unique sur un groupe de lignes au lieu de la table entière?

 
CREATE TABLE IF NOT EXISTS grouped_executions (
    id    INTEGER UNSIGNET NOT NULL , 
    execution_id INTEGER UNSIGNED NOT NULL REFERENCES execution.execution_id , 
    president  BOOLEAN NOT NULL DEFAULT 0 

    PRIMARY KEY (id, execution_id) 
) ENGINE = InnoDB ; 

tout ce que je veux est de faire le président unique dans un groupe de lignes avec la même id.

par exemple: i telles données:

 
id | execution_id | president 
= - = - = - = - = - = - = - = 
1 | 1   | 0 
1 | 2   | 1 
1 | 3   | 0 
1 | 4   | 0 
je veux mysql empêche l'insertion d'une nouvelle ligne avec id = 1 & président = 1

(bien sûr je peux faire une autre table qui détient le président d'un groupe, mais est structure ci-dessus possible?)

+0

Je pense qu'un meilleur design est comme vous l'avez dit, placez-le dans une autre table. – Danosaure

+0

ouais! je vais faire une autre table :) merci – everplays

Répondre

1

Vous pouvez essayer de définir la valeur NULL par défaut pour president clé comme unique permet plusieurs NULL valeurs, mais, il se genre d'aucun sens d'avoir un bool avec un seul 1 et beaucoup NULL s, mais pas 0. Si vous ne voulez pas mettre d'autres mécanismes comme des déclencheurs (suggérés par @David Hedlund), vous feriez mieux d'utiliser une autre table pour cette relation (comme vous l'avez mentionné). De cette façon, si vous voulez un jour un "secrétaire" ou un "trésor" unique, il serait facile de définir une nouvelle table au lieu d'avoir ce déclencheur (ou un autre) pour vérifier cette relation.

3

Oui, vous pouvez ajouter une contrainte unique pour la combinaison des deux colonnes.

+0

mais j'ai beaucoup de lignes avec id = 1 & president = 0, si je fais "UNIQUE KEY' grouped_executions_id_president' ('id',' president') "je ne peux pas avoir em – everplays

+0

oh, désolé, j'ai mal compris votre question, alors. Je ne sais pas que vous pouvez spécifier l'unicité uniquement pour des valeurs spécifiques comme celle de MySQL (je peux me tromper). Une solution de contournement peut utiliser un déclencheur pour valider une insertion ou une mise à jour. –

-1

Avez-vous essayé?

ALTER TABLE grouped_executions ADD CONSTRAINT PRIMARY KEY (id, president); 
+0

mysql> ALTER TABLE grouped_executions AJOUTER CONSTRAINT PRIMARY KEY (id, president); ERREUR 1068 (42000): Clé primaire multiple définie – everplays

+0

-1 Ne fait pas ce que l'OP demandait. (1,0) plusieurs fois permis. – Danosaure

Questions connexes