2010-06-29 90 views
3

我需要用一百个左右的假记录来填充当前空表,以模拟过去两年来登录以测试我的代码。用于生成示例数据的快速SQL查询

登录表模式是这样的:

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 ... 
丝毫的想法

我需要的是插入N个项目(可以说100)到Logins使

  • User_ID吸引了来自Users表的ID
  • Date_Login其值应在2年前,现在
  • Location应该'site''admin'之间交替之间,但'site'更大的权重(比方说80%的时间)。

希望我能搜集一些SQL-FU,以帮助今后发生类似的问题:d

谢谢!

(我使用的MySQL 5.1)

回答

2

这是一条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()是坏的风格,因为它是低效率的,但是这不是一个性能敏感的任务。