MySQL中为employees表group列的NULL值分配1-10随机数
给NULL值分配1-10随机数的解决方案
没问题,这个需求很好实现,核心就是用UPDATE语句配合随机函数,只针对group列值为NULL的行做更新就行。不过不同数据库的随机函数写法有点差异,我给你列几个常用数据库的具体实现:
MySQL/MariaDB
MySQL里用RAND()生成0到1之间的随机小数,配合FLOOR()取整就能得到1-10的整数。注意group是SQL关键字,要加反引号转义:
UPDATE employees SET `group` = FLOOR(RAND() * 10) + 1 WHERE `group` IS NULL;
每次执行RAND()都会生成新的随机数,所以每个NULL行都会拿到不同的1-10之间的整数。
PostgreSQL
PostgreSQL用random()函数,逻辑和MySQL类似,关键字group要用双引号转义:
UPDATE employees SET "group" = floor(random() * 10) + 1 WHERE "group" IS NULL;
也可以用类型转换简化写法:(random() * 10)::int + 1,效果完全一样。
SQL Server
SQL Server里直接用RAND()的话,所有NULL行会拿到同一个随机数,所以得用NEWID()来保证每行的随机数不同:
UPDATE employees SET [group] = ABS(CHECKSUM(NEWID())) % 10 + 1 WHERE [group] IS NULL;
原理是NEWID()生成唯一的标识符,CHECKSUM()把它转成整数,取绝对值后对10取模得到0-9,加1就变成1-10了。
Oracle
Oracle可以直接用DBMS_RANDOM.VALUE()指定范围,非常直观:
UPDATE employees SET "group" = FLOOR(DBMS_RANDOM.VALUE(1, 11)) WHERE "group" IS NULL;
DBMS_RANDOM.VALUE(1,11)会生成1到11之间的小数(不包含11),取整后就是1-10的整数。
小提示
执行UPDATE之前,建议先跑个SELECT语句验证随机数是否符合预期,比如MySQL下可以这么写:
SELECT FLOOR(RAND() * 10) + 1 AS random_group FROM employees WHERE `group` IS NULL;
确认没问题再执行UPDATE,避免误操作~
内容的提问来源于stack exchange,提问作者user6632933
相关产品推荐
相关产品推荐

