3

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

登录表架构如下所示:

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_IDUsers表的ID字段中提取其值
  • Date_Login应该在 2 年前和现在之间
  • Location'site'应该在和之间交替'admin',但'site'权重更大(比如 80% 的时间)。

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

谢谢!

(我使用的是 MySQL 5.1)

4

2 回答 2

2

这是一条 SQL 语句,用于在 Logins 表中插入一行。您可以重复运行它(例如在存储过程中)以获取多条记录。您必须多次运行它才能获得多条记录,因为如果增加到LIMIT 1LIMIT 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()是不好的风格,因为它效率低下,但这不是一个对性能敏感的任务。

于 2010-06-29T21:00:22.623 回答
0

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

于 2010-06-29T20:55:32.617 回答