如何以随机顺序使MySQL自动递增?
作者:互联网
我有一个表,其中包含几个键到其他表(其中每个键由多列组成).我想为每个键创建一个新的列,它将是一个整数,使得值i表示该键的第i个出现(但我希望该排序是随机的).我想也许某种自动增量可以工作,但我有多个键,因此需要多个列(我相信只允许一个自动增量).
我提出的解决方案似乎没有起作用.首先,我创建了一个新表来存储我感兴趣的列,以及一个额外的列rnd.我将稍后使用rnd作为在我需要实际列而不是函数的上下文中ORDER BY rand()的方法.这是我如何完成第一位:
SET @rnd = 0;
INSERT INTO new_table SELECT col1, ..., colN, @rnd := @rnd+1 FROM original_table ORDER BY rand();
接下来,我将根据键添加一个自动增量,我将使用刚刚创建的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;
然后我会删除自动增量状态并为每个键重复:
ALTER TABLE new_table MODIFY COLUMN first_index INT UNSIGNED NOT NULL;
起初,这似乎可以解决问题.然而,经过仔细检查,似乎没有遵守随机排序.索引列似乎按原始表碰巧使用的顺序创建.我很沮丧,因为我经历了几个非常尴尬的步骤,以确保随机排序,甚至没有工作.为什么我的解决方案不起作用,是否有更优雅的方式来做到这一点?
编辑:显然不清楚我在寻找什么,所以我将尝试一个简单的例子:
Col1 Col2 <other columns>
1997 A
1997 B
2001 B
1997 A
2001 B
1997 A
2001 A
1997 B
上述顺序反映了原始排序,既不是真正可预测的也不是真正随机的.添加我的rnd列并按其排序后,我会有这样的事情:
Col1 Col2 <other columns> rnd
1997 B 1
2001 A 2
1997 B 3
2001 B 4
1997 A 5
1997 A 6
1997 A 7
2001 B 8
然后我会得到这样的第一个索引:
Col1 Col2 <other columns> rnd first_index
1997 B 1 1
2001 A 2 1
1997 B 3 2
2001 B 4 1
1997 A 5 1
1997 A 6 2
1997 A 7 3
2001 B 8 2
因此,1997年B出现2次,所以这些值从1-2开始编号,而1997年出现A出现3次,因此这些值行编号为1-3.我使用了ORDER BY rnd,这是随机的,1997-A的哪一行被赋予索引1,哪一个得到2,哪一个得到3(但是在初始分配之后它将是确定性的).
编辑:我将添加另一个例子,因为我的目标似乎不清楚. MySQL文档显示了获取almost there的方法:
CREATE TABLE animals (
grp ENUM('fish','mammal','bird') NOT NULL,
id MEDIUMINT NOT NULL AUTO_INCREMENT,
name CHAR(30) NOT NULL,
PRIMARY KEY (grp,id)
) ENGINE=MyISAM;
INSERT INTO animals (grp,name) VALUES
('mammal','dog'),('mammal','cat'),
('bird','penguin'),('fish','lax'),('mammal','whale'),
('bird','ostrich');
SELECT * FROM animals ORDER BY grp,id;
这创建了一个表,尽管不是我想要的,但它会变得很近:
+--------+----+---------+
| grp | id | name |
+--------+----+---------+
| fish | 1 | lax |
| mammal | 1 | dog |
| mammal | 2 | cat |
| mammal | 3 | whale |
| bird | 1 | penguin |
| bird | 2 | ostrich |
+--------+----+---------+
这很接近,但我认为至少有两个原因导致这对我不起作用.首先,我需要在现有的表上进行,而不是在我正在创建的表上.其次,我不希望狗首先出现在哺乳动物组中,因为它首先出现在基础表中.我想,有一次,随机化该命令.从那时起,订购将是确定性的,但我希望它首先是随机的.
如果你想知道我想要这样做的动机,here是一个问题,解释我正在尝试用这个做什么.另请注意,解决方案应该在MySQL中.
解决方法:
这就是我要做的.我希望我能正确理解你的问题.这是一种解决方法,也许不是很优雅:
>创建一个随机字段,然后将AUTO_INCREMENT字段(“ID”)作为主键的单个字段,按RND顺序等
>为Col1 / 2的每个组合创建一个带有MIN(ID)的临时表(首先,但随机):
SELECT
MIN(ID) AS MIN_ID, Col1, Col2
FROM
table
GROUP BY
Col1, Col2
>添加第二个INT字段作为first_index
>更新表并将first_index设置为自动增量字段的最小值和运行值之间的差值:
UPDATE
table t, temp_table tmp
SET
t.first_index = (t.ID - tmp.MIN_ID) + 1
WHERE
t.Col1=tmp.Col1 AND t.Col2=tmp.Col2
>可选地删除随机和ID字段,并为以下插入添加具有三个字段Col1 / Col2 / first_index(自动递增)的新PK
标签:mysql,random,auto-increment,order-by 来源: https://codeday.me/bug/20190806/1595136.html