web-dev-qa-db-fra.com

Mysql Innodb: AutoIncrement clé non primaire

Est-il possible d'incrémenter automatiquement une clé non primaire?

Table "book_comments"

book_id     medium_int
timestamp   medium_int
user_id     medium_int
vote_up     small_int
vote_down   small_int
comment     text
comment_id  medium_int

Primary key -> (book_id, timestamp, user_id)

Il n'y aura pas d'autres index sur cette table. Cependant, je voudrais faire l'auto-incrémentation de la colonne comment_id afin de pouvoir facilement créer une autre table:

Table "book_comments_votes"

comment_id  (medium_int)
user_id     (medium_int)

Primary key -> (comment_id, user_id)

Les utilisateurs ne pourraient voter qu'une seule fois par commentaire de livre. Cette table applique cette règle par la clé primaire.

Question:

Est-il possible d’auto-incrémenter une clé autre que la clé primaire - comme dans l’incrémentation automatique de la colonne comment_id dans la table "book_comments"?

Alternatives, discussion:

Je voudrais faire ceci pour la simplicité comme expliqué ci-dessus. Les alternatives ne sont pas prometteuses.

  • Créez la clé commnet_id et appliquez l’intégrité au moyen d’un index unique sur book_id, timestamp, user_id. Dans ce cas, je créerais un index supplémentaire.
  • Conservez la PK et remplacez le commentaire_id dans le book_comments_votes par la PK entière. Cela ferait plus que tripler la taille de la table.

Suggestions? Pensées?

27
ProfileTwist

Oui, vous pouvez. Vous devez juste faire de cette colonne un index.

CREATE TABLE `test` (
  `testID` int(11) NOT NULL,
  `string` varchar(45) DEFAULT NULL,
  `testInc` int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`testID`),
  KEY `testInc` (`testInc`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;


insert into test(
  testID,
 string
)
values (
1,
    'Hello'
);


insert into test( 
testID,
 string
)
values (
2,
    'world'
);

Insérera des lignes avec des valeurs auto-incrémentées pour 'testInc'. Cependant, c'est une chose vraiment stupide à faire.

Vous avez déjà dit la bonne façon de le faire:

"Créez la clé publique comment_id et appliquez l’intégrité au moyen d’un index unique sur book_id, timestamp, user_id."

C'est exactement la façon dont vous devriez le faire. Non seulement il vous fournit une clé primaire appropriée pour la table dont vous aurez besoin pour les requêtes futures, mais il satisfait également le principe du moindre étonnement .

39
Danack

Depuis MySQL 5.5, cela semble être possible sans un index ou clé primaire un champ INT à fournir avec auto-incrémentation.

0
loebe