J'ai besoin d'exécuter un programme d'installation qui peut également être un programme de mise à jour. Le programme d'installation doit pouvoir finir par avoir un certain schéma/structure de la base de données mysql, peu importe si certaines des tables existaient, ont raté quelques colonnes ou n'ont pas besoin d'être modifiées car leur structure est à jour.
Comment puis-je faire une élégante combinaison de ALTER
et CREATE
?
Je pensais qu'il devait y avoir quelque chose comme "AJOUTER ... SI ... Dupliquer"
Disons que j'ai la table A. Dans un client, la table a une colonne -A1, et un autre client a la même table mais avec la colonne A1 et la colonne A2.
Je veux que ma commande sql fasse en sorte que la table A des deux clients contienne trois colonnes: A1, A2 et A3.
Encore une fois, mon script est un fichier sql que je sauvegarde sur mysql.
Comment fait-on ça? Merci :-)
MySQL INFORMATION_SCHEMA
base de données à la rescousse:
-- First check if the table exists
IF EXISTS(SELECT table_name
FROM INFORMATION_SCHEMA.TABLES
WHERE table_schema = 'db_name'
AND table_name LIKE 'wild')
-- If exists, retreive columns information from that table
THEN
SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = 'tbl_name'
AND table_schema = 'db_name';
-- do some action, i.e. ALTER TABLE if some columns are missing
ALTER TABLE ...
-- Table does not exist, create a new table
ELSE
CREATE TABLE ....
END IF;
Plus d'information:
MISE À JOUR:
Une autre option, peut-être plus simple, consiste à supprimer la table existante et à la recréer avec le nouveau schéma. Pour ce faire, vous avez besoin de:
Donc, dans le code SQL:
CREATE TABLE old_table_copy LIKE old_table;
INSERT INTO old_table_copy
SELECT * FROM old_table;
DROP TABLE old_table;
CREATE TABLE new_table (...new values...);
INSERT INTO new_table ([... column names from old table ...])
SELECT [...column names from old table ...]
FROM old_table_copy;
DROP TABLE old_table_copy;
En fait, la dernière étape, "Drop table temporaire.", Vous pouvez ignorer pendant un certain temps. Au cas où, vous voudriez avoir une sorte de sauvegarde de l'ancienne table, "juste au cas où".
Plus d'information:
Eh bien, si vous utilisez un langage de codage, faites:
SHOW TABLES LIKE 'myTable'
si elle retourne une valeur appeler l'alter else appeler la création