用于生成示例数据的快速SQL查询

时间:2010-06-29 20:40:50

标签: sql mysql database data-generation

我需要用一百个左右的假记录填充一个当前空表,以模拟过去两年的登录,以测试我的代码。

登录表架构如下所示:

CREATE TABLE `Logins` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `User_ID` int(11) NOT NULL,
  `Date_Login` datetime NOT NULL,
  `Location` enum('site','admin') NOT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

我一般都是SQL的新手,所以,我一点也不知道查询应该是什么样的

INSERT INTO `Logins` (`User_ID`,`Date_Login`,`Location`) VALUES ...

我需要的是在Logins中插入N个条目(比方说100),以便

  • User_IDUsers表的ID字段中提取其值
  • Date_Login应介于2年前和现在
  • 之间
  • Location应该在'site''admin'之间切换,但'site'的权重会更高(比如80%的时间)。

希望我能收集到一些SQL-fu来帮助解决类似的问题:D

谢谢!

(我正在使用MySQL 5.1)

2 个答案:

答案 0 :(得分:2)

这是一个将单行插入Logins表的SQL语句。您可以重复运行(例如在存储过程中)以获取多个记录。您必须多次运行才能获得多条记录,因为如果将LIMIT 1增加到LIMIT 10,您将获得10条记录,但每条记录的User_ID值都相同。

INSERT INTO `Logins` (`User_ID`, `Date_Login`, `Location`)
SELECT
  users.ID AS `User_ID`,
  DATE_SUB(NOW(), INTERVAL FLOOR(1 + (RAND() * (365 * 2))) DAY) AS `Date_Login`,
  IF(RAND() > 0.8, 'admin', 'site') AS `Location`
FROM users
ORDER BY RAND()
LIMIT 1;

通常ORDER BY RAND()样式不好,因为效率低,但这不是对性能敏感的任务。

答案 1 :(得分:0)

如果您想使用完整的SQL解决方案,可以使用以下方法创建循环:http://dev.mysql.com/doc/refman/5.1/en/iterate-statement.html 要获得随机日期,您可以将RAND()与+,*和一些时间戳结合使用。

相关问题