2010-07-09 4 views
2

J'ai une table avec des éléments dedans (id, nom, etc) et je veux une sorte de schéma de base de données pour pouvoir avoir plusieurs copies de l'élément tout en étant capable d'incrémenter les identifiants. Il y aura un champ appelé startdate ou date_from_which_this_entry_should_be_used.mysql manuel increment ids?

J'ai pensé deux façons de mettre en œuvre ceci:

  1. ont une table avec seulement ids (clé primaire, auto-incrément) et faire joint à une table qui a toutes les informations de l'élément.

    Avantages:

    • facile à comprendre
    • difficile pour quelqu'un qui vient après moi de se confondre

    Inconvénients:

    • nécessite plus de débogage et de codage puisque ce système est déjà utilisé
    • semble bizarre d'avoir une table avec un seul champ
  2. Avoir une seule table en utilisant une sous-sélection pour obtenir la valeur MAX (+1) à appliquer aux nouveaux éléments.

    Avantages:

    • table unique
    • seulement des ajustements mineures du code (mais pas du tout différent, peut-être)

    Inconvénients:

    • sujettes à des erreurs (incrément manuel , ne peut pas autoriser les suppressions ou la valeur MAX peut être désactivée)

Merci d'avance!

Répondre

6

Vous devez créer une table appelée item_ids ou autre pour générer des valeurs d'ID. C'est correct que cela n'a qu'une seule colonne.

CREATE TABLE item_ids (
    item_id INT AUTO_INCREMENT PRIMARY KEY 
) ENGINE=InnoDB; 

Vous n'avez même pas besoin de valider des données. Vous utilisez simplement pour générer des valeurs id:

START TRANSACTION; 
INSERT INTO item_ids DEFAULT VALUES; 
SET @id = LAST_INSERT_ID(); 
ROLLBACK; 

Alors maintenant, vous avez une méthode sûre pour créer de nouveaux concurrency ids. Puis vous créez une clé primaire composée pour votre table items. Vous devez utiliser MyISAM pour cela.

CREATE TABLE items (
    item_id INT, 
    seq_id INT AUTO_INCREMENT, 
    name VARCHAR(20), 
    etc VARCHAR(20), 
    PRIMARY KEY (item_id, seq_id) 
) ENGINE=MyISAM; 

MyISAM prend en charge une colonne d'auto-incrémentation dans une clé primaire composé, qui va commencer à la valeur au-dessus de 1 pour chaque nouvelle item_id.* Il utilise également MAX(item_id)+1 donc si vous supprimez le dernier, sa valeur sera réaffectée. Ceci est différent de l'utilisation d'AUTO_INCREMENT où une valeur supprimée n'est pas réutilisée.

Si vous insérez un nouvel élément, ou si vous insérez une nouvelle copie d'un élément existant, vous utilisez un INSERT similaire:

INSERT INTO items (item_id, name, etc) VALUES (@id, 'Stephane', 'etc'); 

Le paramètre @id est soit une valeur d'un élément existant, ou bien la valeur générée automatiquement que vous avez obtenue de la table item_ids. * InnoDB ne prend en charge l'incrémentation automatique que comme première colonne d'une clé primaire ou unique et ne débute pas le comptage pour chaque valeur distincte de l'autre colonne.