【问题标题】:Create a computed column based on another column in MySQL基于 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 是否有重复项的替代方法。我认为这是一种更好的方法,可以允许更多的值。

【问题讨论】:

    标签: mysql sql database-design formatting auto-increment


    【解决方案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% 可能不会成为问题。好处是简单 - 总是一件好事。
    猜你喜欢
    • 1970-01-01
    • 2010-12-23
    • 2021-07-15
    • 1970-01-01
    • 2022-06-14
    • 2022-11-28
    • 1970-01-01
    • 2012-09-15
    • 2011-09-04
    相关资源
    最近更新 更多