我有一个表,其中包含进入其他表的几个键(其中每个键由多列组成)。我想为每个键创建一个新列,该列将是一个整数,以便该值i
表示该ith
键的出现(但我希望该排序是随机的)。我想也许某种自动增量会起作用,但我有多个键,因此需要多列(我相信只允许一个自动增量)。
我想出的解决方案似乎不起作用。首先,我创建了一个新表来存储我感兴趣的列,以及一个额外的列rnd
. 我rnd
稍后会ORDER BY rand()
在需要实际列而不是函数的上下文中使用。这是我如何完成第一点:
SET @rnd = 0;
INSERT INTO new_table SELECT col1, ..., colN, @rnd := @rnd+1 FROM original_table ORDER BY rand();
Run Code Online (Sandbox Code Playgroud)
接下来,我将根据键添加一个自动增量,并使用rnd
我刚刚创建的列。在ALTER TABLE...ORDER BY
不通过函数(如允许排序rand()
),所以这就是为什么我需要创建的rnd
第一列:
ALTER TABLE new_table ADD first_index INT UNSIGNED NOT NULL AUTO_INCREMENT, ADD KEY(col1, col2, first_index), ORDER BY rnd;
Run Code Online (Sandbox Code Playgroud)
然后我会删除自动增量状态并为每个键重复:
ALTER TABLE new_table MODIFY COLUMN first_index INT UNSIGNED NOT NULL;
Run Code Online (Sandbox Code Playgroud)
起初,这似乎奏效了。然而,仔细检查后,似乎没有遵守随机排序。索引列的创建顺序与原始表碰巧使用的顺序相同。当我经历了几个非常尴尬的步骤以确保随机排序时,我感到相当沮丧,而这甚至不起作用。为什么我的解决方案不起作用,有没有更优雅的方法来做到这一点?
编辑:显然我不清楚我在找什么,所以我会尝试一个简单的例子:
Col1 Col2 <other columns>
1997 …
Run Code Online (Sandbox Code Playgroud)