数据库
首页 > 数据库> > 如何以随机顺序使MySQL自动递增?

如何以随机顺序使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