代码之家  ›  专栏  ›  技术社区  ›  Austin Hyde

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

  •  3
  • Austin Hyde  · 技术社区  · 16 年前

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

    登录表架构如下:

    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 以便

    • User_ID Users 表的 ID 领域
    • Date_Login 应该是两年前到现在
    • Location 应该在 'site' 'admin' 但是 “站点” 更重的权重(比如80%的时间)。

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

    谢谢!

    (我使用的是MySQL5.1)

    2 回复  |  直到 16 年前
        1
  •  2
  •   dvogel    16 年前

    下面是一个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() 不是很好的样式,因为它效率很低,但这不是一个性能敏感的任务。

        2
  •  0
  •   greg0ire    16 年前

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