繁体   English   中英

从枚举中减去数字

[英]Subtract number from enum

我在data表中的number列具有枚举值:

1, 2, 3, 4, 5, 101, 102, 103, 104, 105

我想使用查询为所有行设置number = number - 100的值:

UPDATE data SET data.number = (data.number - 100) WHERE data.number > 100

但它不适用于枚举数据。

您只能对基数(整数、浮点数、双精度、小数、日期)进行算术运算。 枚举数据类型是名义上的。

您可以尝试在 SQL 中进行转换,但如果可以执行此操作,则问题是您选择了错误的数据类型。

您专门使用数字来表示状态应该是一个危险信号。

但它不适用于枚举数据。

当然。 ENUM 数据类型的字符串值不是存储在表数据体中的值——它仅包含值的 2 字节索引,并且根据字符串值列表存储在表定义区域中,无法通过任何 DML 操作更改。 只有 DDL (ALTER TABLE) 可以更改 ENUM 值字符串表示定义。

发布的查询会将data.number视为索引值 - 因此您必须得到错误(源值为 1-10,最终值为负数,而 ENUM 索引值为 UNSIGNED)。

这有点复杂。

Mysql 不允许从 ENUM 转换数字,因为上面说数字不应该用作ENUM 值

但是如果您需要 ENUM 字段的值,您可以将其转换为字符。

最后一步是将该文本转换为数字。

架构(MySQL v5.7)

CREATE TABLE IF NOT EXISTS `data` (   

  number ENUM('1', '2', '3', '4', '5', '101', '102', '103', '104', '105')  
 ) ;

INSERT INTO `data` VALUES ( '103');

UPDATE `data` SET number = CAST(CAST(`number` AS CHAR) AS UNSIGNED)  - 100 WHERE CAST(CAST(`number` AS CHAR) AS UNSIGNED) >= 100;

查询 #1

SELECT * FROM `data`;

| number |
| ------ |
| 3      |

在 DB Fiddle 上查看

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM