基于 MySQL 中的另一列创建计算列
Posted
技术标签:
【中文标题】基于 MySQL 中的另一列创建计算列【英文标题】:Create a computed column based on another column in MySQL 【发布时间】:2013-05-04 02:40:40 【问题描述】:我的表中有 2 列:varchar(8)
和 int
。
我想auto-increment
int column
,当我这样做时,我想将值复制到varchar(8) column
,但是用0填充它直到它有8个字符长,例如,如果@987654326 @ 增加到 3
,varchar(8)
列将包含 '00000003'
。
我的两个问题是,当varchar(8)
列因为我不想重复而变为'99999999'
时会发生什么?
我将如何在 mysql 中执行此操作?
如果我的值可以在00000000
到99999999
之间,在我用完之前我可以拥有多少个值?
这是我创建随机 8 个字符串并检查 MySQL 是否有重复项的替代方法。我认为这是一种更好的方法,可以允许更多的值。
【问题讨论】:
【参考方案1】:简单,如果列是唯一的,它会抛出一个异常,告诉该值已经存在。但如果不是唯一的,在99999999
之后,您将收到该值被截断的错误消息。
替代方案,为什么不使用INT AUTO_INCREMENT
?或带有日期/时间组合的自定义 ID,例如
YYMMDD-00000
这将有每天最多 99999 条记录。它将在第二天重置。
【讨论】:
我将如何在 MySQL 中执行此操作以及在00000000
到 99999999
之间可以使用多少个值?
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 个字符长。我也想在00000000
和99999999
之间,我应该得到一个广泛的数字?
对。更一般地说,您不应该有两列代表相同的物理数据。使用int
作为您的键,如果您确实需要该值的字符串表示,请在您的表示层中创建它;或者,使用varchar(8)
版本作为主键并取消int
。
当一条记录被插入到表中时,会触发一个触发器,它将带有 varchar(8) 列的 xml 数据传递到另一个系统,这就是我需要 varchar(8) 的原因。另一种选择是将自动递增的 INT 转换为 xml 中的 varchar(8) 吗?如果这是可能的,我想这将避免两个字段代表相同的值。
但是如果我从 0 开始自动递增,那么我会得到比从 10000000 开始更多的值吗?
你只得到了 10% 的价值——你仍然得到10000000-99999999
。即便如此,如果您超过 99999999,该数字将翻转为 9 位数字,您将被淹没。所以我想你一定会期待比 99999999 插入少得多,所以少 10% 可能不会成为问题。好处是简单 - 总是一件好事。以上是关于基于 MySQL 中的另一列创建计算列的主要内容,如果未能解决你的问题,请参考以下文章