带有前缀的MySQL更新字段

带有前缀的MySQL更新字段,mysql,Mysql,我有一张表的前缀是bok-和inv- id | number 1 | bok-1 2 | inv-3 3 | bok-2 4 | inv-2 5 | inv-10 6 | bok-3 它如何对前缀为inv-的字段number进行排序? 在这种情况下,结果将是: id | number 1 | bok-1 2 | inv-1 3 | bok-2 4 | inv-2 5 | inv-3 6 | bok-3 您可以使用MySQL的函数: ORDER BY CAST(SUBS

我有一张表的前缀是
bok-
inv-

id | number
1  | bok-1
2  | inv-3
3  | bok-2
4  | inv-2
5  | inv-10
6  | bok-3
它如何对前缀为
inv-
的字段
number
进行排序?
在这种情况下,结果将是:

id | number
1  | bok-1
2  | inv-1
3  | bok-2
4  | inv-2
5  | inv-3
6  | bok-3

您可以使用MySQL的函数:

ORDER BY CAST(SUBSTRING(number, 5) AS SIGNED)
在电视上看

但是,如果可能的话,最好将前缀和整数部分存储在单独的列中:

ALTER TABLE mytable
  ADD COLUMN prefix ENUM('bok', 'inv'),
  ADD COLUMN suffix INT;

UPDATE mytable SET
  prefix = LEFT(number, 3),
  suffix = SUBSTRING(number, 5);

ALTER TABLE mytable
  DROP COLUMN number;

基本上,您应该重新设计数据库结构。不幸的是,没有其他选项可以有效地处理这个问题,因为数据库不会在这些破折号上建立索引。因此,在两个字段中分开这两个字段是最常见的做法。否则,您将对每个ORDERBY子句运行表扫描

编辑:除了您讨论过的信息之外:很明显,这是一个错误的设计,您要求的操作根本不应该执行


如果不创建一个像样的结构,就不可能实现它,而且以这种方式创建一个解决方案在法律上是可行的。

我不允许重新设计数据库结构。您唯一的选择是在查询中做一些不好的事,或者在其他地方保留一个单独的索引。就这样。我可能不是一个错误的决定,但请确保你知道为什么你会这样做。如果不允许你改变结构,你就必须改变。虽然这可能会在将来影响数据库的性能问题。我不明白你在sqlfiddle上做了什么,但我看到了其中的变化,你在sqlfiddle中所做的脚本,我没有看到任何更新。“我刚才看到你把号码排好了。@GusDeCooL:哦,我没意识到你想更新表格。这表明可能存在误解或设计缺陷-您能否提供更多关于为什么要尝试实现这一点的详细信息?我有两个相同结构的数据库,它将被导出导入。在导入版本数据库上。编号上会有一些空白。我想修复
number
@GusDeCooL中的间隙:
AUTO_INCREMENT
列中的间隙无需担心。