更改MySQL的SHOW COLUMS“附加”值

时间:2019-04-04 21:34:22

标签: mysql alter-table alter

是否可以更改Extra / SHOW COLUMNS句子中显示的DESCRIBE列的te值?

有关此专栏的文档规定如下:

  

额外

     

有关给定列的任何其他可用信息。的   在以下情况下,值是非空的:

     
      
  • 对于具有AUTO_INCREMENT属性的列,auto_increment。

  •   
  • 在更新CURRENT_TIMESTAMP的TIMESTAMP或DATETIME列时   具有ON UPDATE CURRENT_TIMESTAMP属性。

  •   
  • 对于生成的列为VIRTUAL GENERATED或VIRTUAL STORED。

  •   
  • DEFAULT_GENERATED用于具有表达式默认值的列。

  •   

我有下一个表格列的信息,但是我希望删除Extra列的start_date值。

有没有办法做到这一点?

+--------------------+--------------------+------+-----+-------------------+-------------------+
|       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 |
+--------------------+--------------------+------+-----+-------------------+-------------------+

编辑:

我已经在PHP中实现了一种指纹验证方法,该方法可以区分DESCRIBE表的值,即使这些列具有表达式默认值,我的生产数据库版本也没有该Extra值,所以目前,我希望更改该值,因此在开发环境中实现的指纹验证方法不会出错。

生产数据库位于Mysql <8.0中,因此,按照Bill Karwin的回答,我的MySQL开发环境版本8.0遇到了问题

3 个答案:

答案 0 :(得分:2)

不清楚您要删除为什么的问题。只是注意到该列的默认值是一个表达式。

要使Extra字段为空,必须将列的默认值设置为常数或NULL。

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    |       |
+------------+------------------+------+-----+---------+-------+

请注意,额外信息“ DEFAULT_GENERATED”仅在MySQL 8.0中存在。我怀疑它与支持DEFAULT子句中的表达式的新功能有关。任何其他表达式也会导致此额外信息。

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 |
+------------+------------------+------+-----+---------------------------+-------------------+

答案 1 :(得分:1)

Topicstarters评论

  

我已经在PHP中实现了一种指纹验证方法,该方法与众不同   DESCRIBE表的值,我有生产中的数据库版本   即使这些列有一个   表达式默认值,所以目前,我希望更改该值,以便   我实现的指纹验证方法没有错误   在我的开发环境中。

更标准的SQL方法将适用于MySQL 8

查询

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>'

此查询应与DESCRIBE的输出匹配 然后,您可以在REPLACE()输出上使用information_schema.COLUMNS.EXTRA来删除或编辑所需的方式。
例如,删除DEFAULT_GENERATEDVIRTUAL GENERATEDgenerated columns)之类的额外功能

答案 2 :(得分:0)

您需要一个alter table语句。像

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

您可以设置默认值

DEFAULT 1 NOT NULL