2
votes

Modifier la valeur "Extra" de MySQL SHOW COLUMNS

Existe-t-il un moyen de modifier la valeur de la colonne Extra qui est affichée avec les phrases SHOW COLUMNS / DESCRIBE ?

La documentation sur cette colonne indique ce qui suit:

Toute information supplémentaire disponible sur une colonne donnée. le la valeur n'est pas vide dans ces cas:

  • auto_increment pour les colonnes qui ont l'attribut AUTO_INCREMENT.

  • lors de la mise à jour des colonnes CURRENT_TIMESTAMP pour TIMESTAMP ou DATETIME ont l'attribut ON UPDATE CURRENT_TIMESTAMP.

  • VIRTUAL GENERATED ou VIRTUAL STORED pour les colonnes générées.

  • DEFAULT_GENERATED pour les colonnes qui ont une valeur d'expression par défaut.

J'ai les informations sur les colonnes du tableau suivant mais je souhaite supprimer la valeur Extra de la colonne start_date .

Y a-t-il un moyen de faire cela?

+--------------------+--------------------+------+-----+-------------------+-------------------+
|       Field        |        Type        | Null | Key |      Default      |       Extra       |
+--------------------+--------------------+------+-----+-------------------+-------------------+
| id_machine_product | "int(10) unsigned" | NO   | PRI | NULL              | auto_increment    |
| ...                | ...                | ...  | ... | ...               | ...               |
| start_date         | timestamp          | NO   |     | CURRENT_TIMESTAMP | DEFAULT_GENERATED |
+--------------------+--------------------+------+-----+-------------------+-------------------+

EDIT:

J'ai implémenté une méthode de validation d'empreintes digitales en PHP qui diffère du DESCRIBE tables, j'ai des versions de base de données en production qui n'ont pas cette valeur supplémentaire même si ces colonnes ont une valeur par défaut d'expression, donc actuellement, je souhaite modifier cette valeur afin de ne pas obtenir d'erreurs de ma méthode de validation d'empreinte digitale implémentée dans mon environnement de développement.

Les bases de données de production sont dans Mysql


3 commentaires

"Y a-t-il un moyen de changer la valeur de la colonne Extra qui est affichée avec les phrases SHOW COLUMNS / DESCRIBE?" Pourquoi voudriez-vous changer cette sortie ... La réponse simple est que vous ne pouvez pas sauf si vous ALTER la table et supprimez ces options.


@RaymondNijland J'ai implémenté une méthode de validation d'empreintes digitales en PHP qui diffère les valeurs des tables DESCRIBE , j'ai des versions de base de données en production qui n'ont pas cette valeur Extra même si ces colonnes avoir une valeur d'expression par défaut, donc actuellement, je souhaite modifier cette valeur afin de ne pas obtenir d'erreurs de ma méthode de validation d'empreinte digitale implémentée dans mon environnement de développement.


Ok maintenant je vois que j'ai également publié une réponse.


3 Réponses :


0
votes

vous avez besoin d'une instruction alter table. Quelque chose comme

DEFAULT 1 NOT NULL 

Vous pouvez définir une valeur par défaut comme

ALTER TABLE `document` MODIFY COLUMN `start_date ` INT AUTO_INCREMENT;


2 commentaires

En effet. Cela générerait une valeur "auto_increment" dans la colonne supplémentaire comme indiqué dans la documentation citée, néanmoins la question est de savoir s'il existe un moyen de modifier uniquement la valeur supplémentaire, indépendamment de la valeur auto-générée de définir une colonne avec AUTO_INCREMENT comme dans l'exemple de votre réponse.


Oui, vous devez définir la valeur par défaut sur quelque chose.



2
votes

Il n'est pas clair d'après votre question pourquoi vous voulez éliminer les informations supplémentaires. Il suffit de noter que la valeur par défaut de la colonne est une expression.

Pour rendre le champ Extra vide, vous devez faire de la valeur par défaut de la colonne une valeur constante ou NULL.

mysql > alter table foo modify start_date timestamp default (now() + interval 1 hour);

mysql> show columns from foo;
+------------+------------------+------+-----+---------------------------+-------------------+
| Field      | Type             | Null | Key | Default                   | Extra             |
+------------+------------------+------+-----+---------------------------+-------------------+
| id         | int(10) unsigned | NO   | PRI | NULL                      |                   |
| start_date | timestamp        | YES  |     | (now() + interval 1 hour) | DEFAULT_GENERATED |
+------------+------------------+------+-----+---------------------------+-------------------+

Remarque que les informations supplémentaires "DEFAULT_GENERATED" ne sont présentes que dans MySQL 8.0. Je soupçonne que cela est lié à la nouvelle fonctionnalité de prise en charge des expressions dans la clause DEFAULT. Toute autre expression entraîne également ces informations supplémentaires.

mysql> create table foo ( id int unsigned primary key, start_date timestamp not null default current_timestamp);

mysql> show columns from foo;
+------------+------------------+------+-----+-------------------+-------------------+
| Field      | Type             | Null | Key | Default           | Extra             |
+------------+------------------+------+-----+-------------------+-------------------+
| id         | int(10) unsigned | NO   | PRI | NULL              |                   |
| start_date | timestamp        | NO   |     | CURRENT_TIMESTAMP | DEFAULT_GENERATED |
+------------+------------------+------+-----+-------------------+-------------------+

mysql> alter table foo modify start_date timestamp default null;

mysql> show columns from foo;
+------------+------------------+------+-----+---------+-------+
| Field      | Type             | Null | Key | Default | Extra |
+------------+------------------+------+-----+---------+-------+
| id         | int(10) unsigned | NO   | PRI | NULL    |       |
| start_date | timestamp        | YES  |     | NULL    |       |
+------------+------------------+------+-----+---------+-------+


5 commentaires

Attendez-vous que MySQL 8.0 en plus de la contrainte CHECK, les expressions dans les index prennent désormais également en charge les expressions par défaut?


Marqué comme la réponse pour la partie MySQL 8.0.


@RaymondNijland, oui, c'est une nouvelle fonctionnalité de MySQL 8.0. Vous pouvez utiliser une expression par défaut si vous la mettez entre parenthèses. Voir [DEFAULT {literal | (expr)}] dans la référence de syntaxe: dev.mysql.com/doc/refman/8.0/en/create-table.html


Merci @BillKarwin je ne l'ai jamais remarqué auparavant quand j'ai regardé ce qui avait été changé dans la syntaxe MySQL 8.


Voir aussi "Prise en charge des types de données" dans dev.mysql.com/ doc / refman / 8.0 / fr / mysql-nutshell.html



1
votes

Commentaire Topicstarters

J'ai implémenté une méthode de validation d'empreintes digitales en PHP qui diffère les valeurs des tables DESCRIBE, j'ai des versions de base de données en production qui n'a pas cette valeur supplémentaire même si ces colonnes ont un valeur par défaut de l'expression, donc actuellement, je souhaite modifier cette valeur afin Je n'obtiens aucune erreur de ma méthode de validation d'empreinte digitale implémentée dans mon environnement de développement.

La méthode SQL la plus standard serait qui fonctionne également dans MySQL 8

Query

SELECT 
    information_schema.COLUMNS.COLUMN_NAME AS 'Field'
    , information_schema.COLUMNS.COLUMN_TYPE AS 'Type'
    , information_schema.COLUMNS.IS_NULLABLE AS 'Null'
    , information_schema.COLUMNS.COLUMN_KEY AS 'Key'
    , information_schema.COLUMNS.COLUMN_DEFAULT AS 'Default'
    , information_schema.COLUMNS.EXTRA AS 'Extra'
FROM 
    information_schema.TABLES
INNER JOIN
    information_schema.COLUMNS ON information_schema.TABLES.TABLE_NAME =  information_schema.COLUMNS.TABLE_NAME
WHERE
    information_schema.TABLES.TABLE_NAME = '<table>'

Cette requête doit correspondre à la sortie de DESCRIBE Ensuite, vous pouvez utiliser REPLACE () sur la sortie information_schema.COLUMNS.EXTRA pour supprimer ou modifier comme vous le souhaitez.
Par exemple, la suppression de fonctionnalités supplémentaires telles que DEFAULT_GENERATED ou VIRTUAL GENERATED ( colonnes générées )


4 commentaires

Cela semble être une solution de contournement très prometteuse, mais j'ai un problème avec votre requête, j'obtiens 4 fois les lignes de SHOW COLUMS / DESCRIBE , je manque quelque chose?


"J'obtiens 4 fois les lignes de" cela ne devrait pas être possible donc je n'ai aucune idée de ce que vous faites @Rodrirokr la requête est en quelque sorte testée avec db-fiddle.com/f/h8NTqdT6Sa52w69Uu8WTpu/0 comme je l'ai utilisé avant pour répondre à une question dans le passé.


Que je suis bête! Cette requête recherche dans tout le serveur, j'ai plusieurs bases de données avec les mêmes noms de table (une pour chaque client).


"J'ai plusieurs bases de données avec les mêmes noms de table" Oui, la requête devrait idéalement implémenter un filtre information_schema.TABLES.TABLE_SCHEMA = DATABASE () @Rodrirokr en supposant que vous travaillez avec UTILISER la base de données ou une base de données par défaut lors de la connexion avec PHP