【问题标题】:Alter MySQL's SHOW COLUMS "Extra" value更改 MySQL SHOW COLUMNS "Extra" 值
【发布时间】:2019-08-26 18:12:53
【问题描述】:

有没有办法更改Extra 列的te 值,该列与SHOW COLUMNS/DESCRIBE 句子一起显示?

关于本专栏的文档说明如下:

额外

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

  • 具有 AUTO_INCREMENT 属性的列的自动增量。

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

  • VIRTUAL GENERATED 或 VIRTUAL STORED 用于生成的列。

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

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

有没有办法做到这一点?

+--------------------+--------+------+ -----+--------------------------------+--------------------------------+ |领域 |类型 |空 |钥匙 |默认 |额外 | +--------------------+--------+------+ -----+--------------------------------+--------------------------------+ | id_machine_product | "int(10) 无符号" |否 |优先级 |空 |自动增量 | | ... | ... | ... | ... | ... | ... | |开始日期 |时间戳 |否 | | CURRENT_TIMESTAMP | DEFAULT_GENERATED | +--------------------+--------+------+ -----+--------------------------------+--------------------------------+

编辑:

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

生产数据库位于 Mysql

【问题讨论】:

  • “有没有办法改变与 SHOW COLUMNS/DESCRIBE 语句一起显示的 Extra 列的 te 值?” 你为什么要改变这个输出..简单的答案是你不能,除非你 ALTER 表并删除这些选项。
  • @RaymondNijland 我已经在 PHP 中实现了一种指纹验证方法,它可以区分 DESCRIBE 表的值,我在生产中的数据库版本没有 Extra 值,即使这些列有表达式默认值,所以目前,我希望更改该值,这样我就不会从我在开发环境中实现的指纹验证方法中得到错误。
  • 好的,我知道我也发布了答案。

标签: mysql alter-table alter


【解决方案1】:

您需要一个 alter table 语句。类似的东西

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

你可以设置一个默认值,比如

DEFAULT 1 NOT NULL 

【讨论】:

  • 确实如此。如引用的文档中所述,这将在额外列中生成一个值“auto_increment”,但问题是是否有办法仅更改额外值,与使用AUTO_INCREMENT 设置列的自动生成值无关就像你的答案的例子一样。
  • 是的,你需要设置默认值。
【解决方案2】:

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

要将额外字段设为空白,您必须将列的默认值设为常量值或 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 |
+------------+------------------+------+-----+---------------------------+-------------------+

【讨论】:

  • 等待 MySQL 8.0 除了 CHECK 约束之外,索引中的表达式现在还支持默认表达式?
  • 标记为 MySQL 8.0 部分的答案。
  • @RaymondNijland,是的,这是 MySQL 8.0 中的一个新特性。如果将表达式放在括号中,则可以将其用作默认值。请参阅语法参考中的[DEFAULT {literal | (expr)} ]dev.mysql.com/doc/refman/8.0/en/create-table.html
  • 感谢@BillKarwin,当我查看 MySQL 8 语法的变化时,我从未注意到它。
  • 另见dev.mysql.com/doc/refman/8.0/en/mysql-nutshell.html中的“数据类型支持”
【解决方案3】:

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的输出 然后你可以在information_schema.COLUMNS.EXTRA 输出上使用REPLACE() 来删除或编辑你想要的方式。
例如删除额外的功能,如 DEFAULT_GENERATEDVIRTUAL GENERATED (generated columns)

【讨论】:

  • 这听起来像是一个非常有前途的解决方法,但我的查询有问题,我从SHOW COLUMS/DESCRIBE 得到的行数是 4 倍,我错过了什么吗?
  • “我得到的行数是 4 倍” 这应该是不可能的,所以我不知道你在做什么 @Rodrirokr 以某种方式用 @ 测试的查询987654322@,因为我以前用它来回答过去的问题。
  • 傻我!此查询在整个服务器中搜索,我有多个具有相同表名的数据库(每个客户端一个)。
  • “我有多个具有相同表名的数据库” 是的,假设您使用USE database 或默认数据库,查询应该理想地实现information_schema.TABLES.TABLE_SCHEMA = DATABASE() 过滤器@Rodrirokr与 PHP 连接时
猜你喜欢
  • 1970-01-01
  • 2011-06-13
  • 1970-01-01
  • 2014-09-23
  • 1970-01-01
  • 2019-10-21
  • 1970-01-01
  • 1970-01-01
  • 2016-09-03
相关资源
最近更新 更多