2017-10-09 10 views
0

私はループを作成し、500,000レコードを取得するために偽のデータでデータベーステーブルを埋める方法を知りたがっています。私は次のフィールドを持つテーブルを持っています:customer_idは1〜1000、staff_idは1〜5人のスタッフ、car_idは1〜10,000、qtyは1〜3、date_orderedは1975〜2017、date_returnedは1975〜 2017、日付の場合、date_orderedとdate_returnedの間の差異は2〜3日間である必要があります。MySQLでデータベーステーブルを埋めるためにループを実行するには?

これについてのお手伝いをさせていただきます。

CREATE TABLE car_transaction 
(
    transaction_id INTEGER NOT NULL, 
    customer_id INTEGER, 
    staff_id INTEGER, 
    car_ID INTEGER, 
    QTY INTEGER, 
    date_ordered, 
    date_returned, 
    PRIMARY KEY (transaction_id)); 
+0

ランダムなデータをテーブルに入れたいですか? –

+0

私はええ、ちょうどデータをテストする!ありがとう! – Keith

+2

* ...する方法...:* 1)使用するプログラミング言語を選択してください。 2)ジョブを完了させるコードを書く。 3)2)で問題が発生した場合は、戻ってコードを投稿して質問してください。 – Binarus

答えて

1

これは純粋なMySQL SQLコードでのみ可能です。

これは私が

CREATE TABLE car_transaction 
(
    transaction_id INTEGER NOT NULL AUTO_INCREMENT, # included AUTO_INCREMENT HERE 
    customer_id INTEGER, 
    staff_id INTEGER, 
    car_ID INTEGER, 
    QTY INTEGER, 
    date_ordered DATE, # made DATE type 
    date_returned DATE, # made DATE type 
    PRIMARY KEY (transaction_id) 

)を使用しました表です。 CUSTOMER_IDため

は、我々は1-1000を持って、staff_id我々は1-5のスタッフを持って、car_idは1〜10,000の間 で、数量は1-3

これらのフィールドがある範囲の使用について明確な要件を持っていますしたがって、例えば、顧客IDの式

であり、この式は

SELECT ROUND((RAND() * (MAX - MIN)) + MIN) 

あるこれらの範囲を生成する式との組み合わせでのMySQLのrand()関数を使用することができ日付の

SELECT ROUND((RAND() * (1000 - 1)) + 1) 

最初の試行結果

ROUND((RAND() * (1000 - 1)) + 1) 
---------------------------------- 
           648 

2回目の試行結果

ROUND((RAND() * (1000 - 1)) + 1) 
---------------------------------- 
           486 

DATE_ORDEREDは1975年から2017年までで、1975年から2017年までであるdate_returned、 date_orderedとdate_returnedの差は で、2〜3日間である必要がありますs。

日付の式は少し複雑です。 しかし、それはまだ今、私たちはすべて結合するデータオフ1つのレコードを生成しますROUND((RAND() * (MAX - MIN)) + MIN)

SELECT DATE(FROM_UNIXTIME(ROUND((RAND() * (UNIX_TIMESTAMP('2017-12-31') - UNIX_TIMESTAMP('1975-01-01'))) + UNIX_TIMESTAMP('1975-01-01')))) 

最初の試行結果

DATE(FROM_UNIXTIME(ROUND((RAND() * (UNIX_TIMESTAMP('2017-12-31') - UNIX_TIMESTAMP('1975-01-01'))) + UNIX_TIMESTAMP('1975-01-01')))) 
------------------------------------------------------------------------------------------------------------------------------------- 
2005-08-04  

2回目の試行結果

DATE(FROM_UNIXTIME(ROUND((RAND() * (UNIX_TIMESTAMP('2017-12-31') - UNIX_TIMESTAMP('1975-01-01'))) + UNIX_TIMESTAMP('1975-01-01')))) 
------------------------------------------------------------------------------------------------------------------------------------- 
1998-07-22  

を使用しています最後のステップ。

クエリ

SELECT 
    record.customer_id 
, record.staff_id 
, record.car_id 
, record.qty 
, record.date_ordered 
, record.date_ordered + INTERVAL record.random_day DAY AS date_returned 
FROM ( 
    SELECT 
    (SELECT ROUND((RAND() * (1000 - 1)) + 1)) AS customer_id 
    , (SELECT ROUND((RAND() * (5 - 1)) + 1)) AS staff_id 
    , (SELECT ROUND((RAND() * (10000 - 1)) + 1)) AS car_id 
    , (SELECT ROUND((RAND() * (3 - 1)) + 1)) AS qty 
    , (DATE(FROM_UNIXTIME(FLOOR((RAND() * (UNIX_TIMESTAMP('2017-12-31') - UNIX_TIMESTAMP('1975-01-01'))) + UNIX_TIMESTAMP('1975-01-01'))))) AS date_ordered 
    , (SELECT ROUND((RAND() * (3 - 2)) + 2)) AS random_day 
    FROM 
    DUAL 
) 
record 

最初の試行結果

customer_id staff_id car_id  qty date_ordered date_returned 
----------- -------- ------ ------ ------------ --------------- 
     633   2 5553  3 2011-11-21 2011-11-24 

2回目の試行結果

customer_id staff_id car_id  qty date_ordered date_returned 
----------- -------- ------ ------ ------------ --------------- 
     300   4 2380  2 2010-08-21 2010-08-23  

手順

DELIMITER $$ 

CREATE 
    PROCEDURE generate_random_data_car_transaction(IN numberOfRows INT) 

    BEGIN 
     DECLARE counter INT; 
     SET counter = 1; 

     WHILE (counter <= numberOfRows) DO 
     INSERT INTO 
      car_transaction 
     (
      customer_id 
      , staff_id 
      , car_id 
      , qty 
      , date_ordered 
      , date_returned 
     ) 

     SELECT 
       record.customer_id 
      , record.staff_id 
      , record.car_id 
      , record.qty 
      , record.date_ordered 
      , record.date_ordered + INTERVAL record.random_day DAY AS date_returned 
      FROM ( 
       SELECT 
       (SELECT ROUND((RAND() * (1000 - 1)) + 1)) AS customer_id 
       , (SELECT ROUND((RAND() * (5 - 1)) + 1)) AS staff_id 
       , (SELECT ROUND((RAND() * (10000 - 1)) + 1)) AS car_id 
       , (SELECT ROUND((RAND() * (3 - 1)) + 1)) AS qty 
       , (DATE(FROM_UNIXTIME(FLOOR((RAND() * (UNIX_TIMESTAMP('2017-12-31') - UNIX_TIMESTAMP('1975-01-01'))) + UNIX_TIMESTAMP('1975-01-01'))))) AS date_ordered 
       , (SELECT ROUND((RAND() * (3 - 2)) + 2)) AS random_day 
       FROM 
       DUAL 
      ) 
      record; 

     SET counter = counter + 1; 
     END WHILE; 
    END$$ 

DELIMITER ; 

CALLプロシージャ

CALL generate_random_data_car_transaction(500000); 

クエリ

SELECT * FROM car_transaction 

結果

transaction_id customer_id staff_id car_ID  QTY date_ordered date_returned 
-------------- ----------- -------- ------ ------ ------------ --------------- 
      1   757   2 2621  2 1982-03-10 1982-03-13  
      2   818   1  368  3 1989-06-06 1989-06-08  
      3   47   2 8538  2 2009-09-30 2009-10-02  
      4   670   2 4597  2 2005-03-20 2005-03-22  
      5   216   2 7651  3 2000-10-08 2000-10-10  
      6   502   2 1364  2 1978-03-28 1978-03-30  
      7   204   2 1910  2 2009-03-17 2009-03-20  
      8   398   2 3934  1 2013-07-02 2013-07-04  
      9   474   1 9286  2 1991-08-06 1991-08-09  
      10   976   1  724  2 2000-05-09 2000-05-12  
... 
... 
... 
     499990   20   5 6595  2 1990-05-01 1990-05-03  
     499991   839   1 7315  2 1989-12-05 1989-12-07  
     499992   14   3 1274  2 1987-11-12 1987-11-14  
     499993   539   2 5422  1 1994-06-24 1994-06-26  
     499994   728   5 7441  3 2000-05-12 2000-05-15  
     499995   512   3 4039  2 1978-02-03 1978-02-06  
     499996   732   5 2599  2 1990-01-11 1990-01-14  
     499997   304   5 6098  2 2011-11-25 2011-11-27  
     499998   818   2 8196  2 1984-01-14 1984-01-16  
     499999   617   5 8160  2 2016-03-15 2016-03-18  
     500000   864   3 7837  2 1980-01-13 1980-01-15 
+0

ありがとうございました! – Keith

0

私のプロジェクトであれば、ランダムなテストデータを生成できるソフトウェアパッケージまたはWebアプリケーションのためにintertoobzを見ていきたいと思います。

私は、最初のものを除くすべての列のデータがいっぱいのCSVファイルを私に渡すことができます。

私はテーブル定義を変更して、最初の列の自動インクリメントを作成します。

それから私は、テーブルに(filenameと呼ばれる)ファイルからデータを読まする

LOAD DATA INFILE filename INTO car_transaction 
    COLUMNS TERMINATED BY ',' 
    LINES TERMINATED BY '\r\n' /* or maybe just '\n' */ 
    (customer_id, staff_id, car_ID, QTY, date_ordered, date_returned) 

を使用すると思います。

関連する問題