改变MySQL显示列“额外”值

问题描述 投票:1回答:3

有没有办法改变用Extra / SHOW COLUMNS句子显示的DESCRIBE列的te值?

有关此列的文档说明如下:

额外

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

  • auto_increment用于具有AUTO_INCREMENT属性的列。
  • 更新CURRENT_TIMESTAMP用于具有ON UPDATE CURRENT_TIMESTAMP属性的TIMESTAMP或DATETIME列。
  • 生成列的虚拟生成或虚拟存储。
  • 对于具有表达式默认值的列,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。

mysql alter-table alter
3个回答
1
投票

Topicstarters评论

我在PHP中实现了一个指纹验证方法来区分DESCRIBE表值,我生产的数据库版本没有那个Extra值,即使这些列有一个表达式默认值,所以目前我希望改变这个值我在开发环境中没有从我实现的指纹验证方法中获得错误。

更标准的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
投票

从您的问题中不清楚为什么要删除额外信息。它只是注意到列的默认值是一个表达式。

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

0
投票

你需要一个alter table语句。就像是

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

您可以设置默认值

DEFAULT 1 NOT NULL 
© www.soinside.com 2019 - 2024. All rights reserved.