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

标签 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 ...

我需要的是将 N 个条目(比如 100 个)插入 Logins 以便

  • User_IDUsers 表的 ID 字段中提取值
  • Date_Login 应该在 2 年前和现在之间
  • Location 应该在 'site''admin' 之间交替,但是 'site' 更重要加权(比如 80% 的时间)。

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

谢谢!

(我使用的是 MySQL 5.1)

最佳答案

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

关于sql - 用于生成示例数据的快速 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3144548/

相关文章:

java - 神秘的 MSSQL 错误消息

sql - ElasticSearch:使用OR AND子句创建 bool 查询

sql - 当所有字段都是可选的时更新查询

database - 用于 sqlserver2008 的 schemaSpy?

WPF 绑定(bind)双向数据网格

sql - 根据特定项目出现的次数对表进行排序

php - Codeigniter 加载不同的数据库配置

python - 查询父类(super class)和继承类

javascript - 使用 for 循环而不是大型 if 语句通过 jQuery 附加信息

c++ - 如何在可扩展存储引擎(JetBlue)中的 JetUpdate() 之后获取 AutoIncrement 值