【问题标题】:A quick SQL query to generate example data用于生成示例数据的快速 SQL 查询
【发布时间】:2010-06-29 20:40:50
【问题描述】:

我需要用大约一百条虚假记录填充当前空表,以模拟过去两年的登录情况,以测试我的代码。

登录表架构如下所示:

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)

【问题讨论】:

    标签: sql mysql database data-generation


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-29
        • 2013-08-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多