如何将虚拟数据插入MySQL?

时间:2017-11-19 23:19:16

标签: mysql sql

我得到了一个大学项目,我必须创建一个有一些选择的数据库。我选择为航班预订系统创建一个数据库。这是非常基本的。

但是,我正在插入虚拟数据,对于其中一个列,FlightNumber,我将需要它对于多个输入是相同的。有没有办法做到这一点。我还需要在其他表中包含值。

例如,FLNum是航班的主要钥匙,是乘客的外键。有没有可以做到这一点的网站?

更新:需要100000条记录

表:乘客

BookRef (PK)
Fname
Lname
Gender
Date_Depart
Date_Return
FLNum (FK)

表:航班

FLNum (PK)
Date_Depart
Tail_No
CID (FK)
FID (FK)

表:船长

CID (PK)
Fname
Lname

表:First_Officers

FID (PK)
Fname
Lname

乘客的样本价值:

BookRef (PK) 4MTH2R
Fname  Hortense
Lname Jacqueminot
Gender Female
Date_Depart 2017-12-26
Date_Return 2017-12-31
FLNum (FK) KQU59GS

2 个答案:

答案 0 :(得分:1)

概述

我们在这里遇到一个问题,我们不希望记录完全随机(例如Etaoin Asdfsdasdf船长于13-09-1045离开)。因此,我们将在Linux中将FLNum声明为整数,主键,auto_increment,并且可能将表定义更改为从1000000而不是1开始(只是为了使所有数字具有或多或少相同的数字位数)。但这是小土豆。

然后我们想要一个给定范围内的出发日期,以及尾号和船长以及第一官员的相同事情。

所以我们开始估算表格的基数。我们想要十万个航班,用一千架飞机做这件事似乎是合理的,这意味着让我们说两百名船长和多少副驾驶。

然后我们需要一个带有姓名和姓氏的辅助("种子")表格,我们可以在GitHub找到它。我们将构建一个XName和一个XSurname表。

船长和第一官员

我们想要200个船长,所以或多或少:

INSERT INTO Captains (`name`,`surname`)
    SELECT `name`, `surname` FROM XNames JOIN XSurnames 
    ORDER BY RAND() LIMIT 200;

如果针对名称/姓氏表运行成千上万,那么上面可能需要时间才能运行,所以你可能想先创建两个临时表,比如说200个姓名和运行

的200个姓氏
CREATE TEMPORARY TABLE tbl1 AS 
    SELECT * FROM XSurnames 
    ORDER BY RAND() LIMIT 200;

然后加入两个临时表(200 * 200给出40000,这有助于保持完全重复的名称低。然后您将从这些40k中选择200个条目)。

出发日期

我们创建一个新表DepartureDates只有一列DepartureDate。然后我们插入一个日期。

INSERT INTO DepartureDates (DepartureDate) VALUES ('2017-12-01');

然后我们插入后一天:

INSERT INTO DepartureDates 
    SELECT DATE_ADD(DepartureDate, INTERVAL 1 DAY) FROM DepartureDates;

表格中现在有2个日期(让他们称之为0和1)。然后,下面的命令将选择0和1并添加2和3:

INSERT INTO DepartureDates 
    SELECT DATE_ADD(DepartureDate, INTERVAL 2 DAY) FROM DepartureDates;

使用INTERVAL 4 DAY再次运行命令将进入其他四个日期。使用第四个命令和8天,我们输入其他8个日期,现在有16天。第五个命令总共三十二天。只需八个命令,您就可以输入几个月的时间。值得约会。

航班

现在你有日期和航班(其他数据,如机场类似),你运行输入:

CREATE PROCEDURE populate()
BEGIN
    DECLARE i int DEFAULT 1;
    WHILE i <= 100000 DO
        INSERT INTO flights (`date`, `cid`, `fid`, whatever)
             VALUES (
            (SELECT DepartureDate FROM DepartureDates ORDER BY RAND() LIMIT 1) AS `date`,
            (SELECT cid FROM Captains ORDER BY RAND() LIMIT 1) AS cid,                
            (SELECT cid FROM FirstOfficers ORDER BY RAND() LIMIT 1) AS fid,
            ... et cetera ...
        );
        SET i = i + 1;
    END WHILE;
END 

然后,CALL populate();将(经过很长一段时间)获得所需的数据。自动增量将处理FLNum。

===

(或者如果您可以在bash,PHP,Perl或python中运行脚本,我可以为您编写一个更简单的生成器)

答案 1 :(得分:0)

您可以使用this PHP库。这个PHP库可以为您生成虚假数据。