web-dev-qa-db-fra.com

MySQL - Rendre une paire de valeurs unique

J'ai une table avec deux valeurs int qui sont des ID. À eux seuls, ces ID peuvent apparaître autant de fois que nécessaire dans la table, mais ensemble, ils ne doivent apparaître qu'une seule fois.

Est-il possible de rendre une paire de valeurs unique tout en permettant aux valeurs individuelles de s'afficher plusieurs fois?

En guise de suivi, si cela est possible, la paire de valeurs peut-elle être utilisée comme clé? J'ai actuellement une 3ème colonne pour une valeur d'incrémentation automatique unique pour ma clé.

35
Josh Brittain

C'est ce qu'on appelle une clé composite.

Si vous souhaitez modifier votre PK réelle en une clé composite, utilisez

Alter table <your table> drop PRIMARY KEY;
Alter table <your table> drop COLUMN <your autoincremented column>;

Alter table <your table> add [constraint <constraint name>] PRIMARY KEY (<col1>, <col2>);

Vous pouvez également simplement ajouter une contrainte unique (votre PK sera la même, et les paires uniques ... devront être uniques).

alter table <your table> add [constraint <constraint name>] unique index(<col1>, <col2>);

Personnellement, je recommanderais la deuxième solution (PK simple + contrainte unique), mais ce n’est qu’un point de vue personnel. Vous pouvez rechercher des arguments pour et contre sur les clés composites sur Google.

La partie entre [] est optionnelle.

MODIFIER

Si vous voulez faire cela dans l'instruction create table

Pour un pk composite

CREATE TABLE Test(
    id1 int NOT NULL, 
    id2 int NOT NULL,
    id3 int NOT NULL,
    PRIMARY KEY (id1, id2)
);

Pour un index unique

CREATE TABLE Test1(
    id1 int NOT NULL AUTO_INCREMENT, 
    id2 int NOT NULL,
    id3 int NOT NULL,
    PRIMARY KEY (id1),
    UNIQUE KEY (id2, id3)
);
57
Raphaël Althaus

Essayez ceci: ALTER TABLE table_name ADD CONSTRAINT uc_name UNIQUE (col1,col2)

8

ajoutez primary key (col1, col2) à votre définition de table de création

0
jspcal