我有一个包含许多行的数据库表,这些行已经填充了数据。此数据是使用 generatedata.com 的在线数据生成表单生成的。
大多数情况下它很好,但问题是许多生成的日期字段是重复的,为了我的目的,我需要它们是唯一的,理想情况是在合理/指定的范围内。
例如,假设我想在2010-01-01和今天之间为每一行添加一个随机但唯一的日期的date
列。我可以使用MySQL查询或一组查询来快速完成这项工作吗?
从技术上讲,这样的随机部分可以正常工作:
UPDATE table
SET date = CONCAT( FLOOR(2010 + (RAND() * (2013-2010)) ),
'-',
FLOOR(1 + (RAND() * (12-1))),'-',FLOOR(1 + (RAND() * (28-1))))
它不必考虑每个可能的日期。它们只需要是有效的日期,所以上面的行给了我一个范围内的随机日期,但是我可以添加什么以确保它们都是唯一的?
答案 0 :(得分:0)
使用mysqldump并将整个表导出为文本文件“|”分离。强>
如下所示,
table.dat
1|aa@aa.com|<<date_column>>
2|aa@aa.com|<<date_column>>
3|bb@b.com|<<date_column>>
1. Use AWK, SED, SHELL, PERL or RUBY (I love ruby) and replace the last
column with a loop on the time given out by the chosen scripting
language. Implement your own logic here.
2. Make sure your final dat file doesn't have any duplicate date.
将final.dat加载到表中!
答案 1 :(得分:0)
您的表中每行的ID列是否都有唯一的整数?如果是这样,请执行以下操作:
UPDATE `table`
SET `date` = CURRENT_DATE() - INTERVAL `id` DAY
这将为您提供每行的不同日期,从今天起向后计数。那应该符合你的需要。如果由于某种原因你需要他们从固定日期算起来,那就试试吧。
UPDATE `table`
SET `date` = '2010-01-01' + INTERVAL `id` DAY
修改强>
如果您的身份证号码不是从0开始,请尝试此操作,如@Randy建议的那样:
UPDATE `table`
SET `date` = '2010-01-01' +
INTERVAL (`id` - (SELECT MIN(`id`) FROM `table`) ) DAY
答案 2 :(得分:0)
我必须对第9章Head First SQL使用类似的查询语句。这是我做的:
str_to_date(concat(floor(1 + rand()*(12-1)),&#39; - &#39;,floor(1 + rand()*(28 -1)),&#39 ; - &#39;,(1999 + FLOOR(RAND()*(2013-1999 +1)))),&#39;%m-%d-%Y&#39;)