2011-06-16 2 views
12

Puis-je, et, si possible, comment puis-je définir la valeur par défaut d'un champ dans une table MySQL à la valeur d'un autre champ?Valeur par défaut de MySQL en tant que valeur de l'autre champ

La chose est: J'ai des données, et chaque objet de données a son ID dans la table. Mais, j'aimerais pouvoir réorganiser les données, en changeant leur index de tri, sans altérer leur identifiant. Par conséquent, le champ sort_num doit être défini par défaut sur la valeur donnée au champ indexé auto-incrémenté ID.

Merci d'avance!

+0

Possible duplicat e de [mysql définir valeur par défaut du champ à l'autre colonne] (https://stackoverflow.com/questions/15384429/mysql-set-field-default-value-to-other-column) – River

Répondre

8

Je vois deux solutions possibles pour cela:

1. Possibilité:

Vous utilisez une fonction d'ignorer simplement sort_num si elle n'est pas réglé:

`SELECT * FROM mytable ORDER BY coalesce(sort_num, id)` 

coalesce() retourne la première valeur non nulle, donc vous insérer des valeurs pour sort_num si vous avez vraiment besoin de réorganiser les éléments.

2. Possibilité:

Vous écrivez un déclencheur, qui règle automatiquement la valeur si elle est pas définie dans l'instruction d'insertion:

DELIMITER // 

CREATE TRIGGER sort_num_trigger 
BEFORE INSERT ON mytable 
FOR EACH ROW BEGIN 
    DECLARE auto_inc INT; 
    IF (NEW.sort_num is null) THEN 
     -- determine next auto_increment value 
     SELECT AUTO_INCREMENT INTO auto_inc FROM information_schema.TABLES 
     WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME = 'mytable'; 
     -- and set the sort value to the same as the PK 
     SET NEW.sort_num = auto_inc; 
    END IF; 
END 
// 

(inspiré par this comment)

Cependant, cela pourrait se heurter à des problèmes de parallélisation (plusieurs requêtes insérant en même temps)

3

C'est une mauvaise idée d'avoir une colonne auto-incrément réarrangé, d'où une meilleure idée serait

Ajouter un sort_num colonne à la table

ALTER TABLE data ADD sort_num column-definition; (column definition same as ID) 

UPDATE data SET sort_num = ID 

jouent maintenant avec sort_num colonne car il n'a pas d'effet sur la colonne ID

+0

bien, je n'ai jamais eu l'intention d'avoir le colonne auto-incrémentée réarrangée, le sort_num avait juste besoin de la valeur de l'autre par défaut pour que la colonne sort_num soit réarrangée et ne gâche pas les index et les incréments automatiques – arik

+1

Eh bien, vous pouvez utiliser la méthode suggérée ci-dessus ou traiter avec le serveur côté. Comme faire insert, obtenir last_insert_key, puis mettre à jour le jeu de données de table sort_num = id où id = last_insert_key –

Questions connexes