基于 MySQL 中的另一列创建计算列

Posted

技术标签:

【中文标题】基于 MySQL 中的另一列创建计算列【英文标题】:Create a computed column based on another column in MySQL 【发布时间】:2013-05-04 02:40:40 【问题描述】:

我的表中有 2 列:varchar(8)int

我想auto-incrementint column,当我这样做时,我想将值复制到varchar(8) column,但是用0填充它直到它有8个字符长,例如,如果@987654326 @ 增加到 3varchar(8) 列将包含 '00000003'

我的两个问题是,当varchar(8) 列因为我不想重复而变为'99999999' 时会发生什么?

我将如何在 mysql 中执行此操作?

如果我的值可以在0000000099999999 之间,在我用完之前我可以拥有多少个值?

这是我创建随机 8 个字符串并检查 MySQL 是否有重复项的替代方法。我认为这是一种更好的方法,可以允许更多的值。

【问题讨论】:

【参考方案1】:

简单,如果列是唯一的,它会抛出一个异常,告诉该值已经存在。但如果不是唯一的,在99999999 之后,您将收到该值被截断的错误消息。

替代方案,为什么不使用INT AUTO_INCREMENT?或带有日期/时间组合的自定义 ID,例如

YYMMDD-00000

这将有每天最多 99999 条记录。它将在第二天重置。

【讨论】:

我将如何在 MySQL 中执行此操作以及在 0000000099999999 之间可以使用多少个值? between 00000000 to 99999999 ==> 总共有 100000000 条记录,包括 00000000。 我需要其中一列是 varchar(8),否则我只会使用 INT。 感谢您的建议。【参考方案2】:

由于您的格式化列依赖于 id 列并且可以从该列派生,因此您的表格设计违反了3NF。

要么创建一个包含派生列的视图(参见sqlfiddle):

CREATE VIEW myview AS
SELECT *, substring(cast(100000000 + id AS CHAR(9)), 2) AS formatted_id
FROM mytable

或者只是在10000000开始你的自动增量,那么它总是8位数字:

ALTER TABLE mytable AUTO_INCREMENT = 10000000;

【讨论】:

我需要一列作为 varchar(8),我的理解是你不能自动增加一个 INT,所以我认为下一个最好的解决方案是自动增加另一个 int字段和左侧用 0 填充 varchar 字段,直到 8 个字符长。我也想在0000000099999999之间,我应该得到一个广泛的数字? 对。更一般地说,您不应该有两列代表相同的物理数据。使用int 作为您的键,如果您确实需要该值的字符串表示,请在您的表示层中创建它;或者,使用varchar(8) 版本作为主键并取消int 当一条记录被插入到表中时,会触发一个触发器,它将带有 varchar(8) 列的 xml 数据传递到另一个系统,这就是我需要 varchar(8) 的原因。另一种选择是将自动递增的 INT 转换为 xml 中的 varchar(8) 吗?如果这是可能的,我想这将避免两个字段代表相同的值。 但是如果我从 0 开始自动递增,那么我会得到比从 10000000 开始更多的值吗? 你只得到了 10% 的价值——你仍然得到10000000-99999999。即便如此,如果您超过 99999999,该数字将翻转为 9 位数字,您将被淹没。所以我想你一定会期待比 99999999 插入少得多,所以少 10% 可能不会成为问题。好处是简单 - 总是一件好事。

以上是关于基于 MySQL 中的另一列创建计算列的主要内容,如果未能解决你的问题,请参考以下文章

如何根据 mySQL 中的另一列选择一列?

在列上创建自定义组并计算 sql 中的另一列

如何根据MySQL中的另一列有条件地选择列

基于R中的另一列数据框找到一列的共同值

如何根据python中的另一列自动添加日期?

Groupby 和 collect_list 基于 PySpark 中的另一列维护顺序