2016-12-03 47 views
1

我在存儲過程中遇到了一些麻煩。我如何從其他多個表中填充範圍和隨機名稱的自動增量表

我想寫一個「創建腳本」,並帶有一個「存儲過程」,在0-100000的時間間隔內輸入「n」。

用戶輸入後,我想要所有的信息進入一個名爲「T」的新表。

SELECT * FROM T; 

我希望它打印:

+----+------------+----------+---------------+---+----+-----+ 
| Id | First Namne| Last Name| Street Address| No| Zip| City| 
+----+------------+----------+---------------+---+----+-----+ 

門牌號碼應在1-300的範圍內。

郵編應該是5個數字,不能以0

每一行開始必須是唯一的,即使我刪除ID列。

I've made 3 files: 
1. Contains 500 unique First Names 
2. Contains 500 unique Last Names 
3. Contains 335 unique Adresses 

我的意思是讓新表「t」取一個隨機的名字和隨機的姓氏。這將需要1次地址300次,並使地址不再上升300次,然後繼續到下一個地址,這樣我的所有行都將是唯一的。 enter code here

這是我多遠,來到我的大腦前墜毀:

/* 
* Sets database to users 
*/ 
USE users; 


/* 
* Removes tables if exists 
*/ 
DROP TABLE IF EXISTS t; 
DROP TABLE IF EXISTS first_names; 
DROP TABLE IF EXISTS last_names; 
DROP TABLE IF EXISTS street_names; 


/* 
* Creating new tables 
*/ 
-- Create table t 
CREATE TABLE t(
     player_id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, 
     first_name VARCHAR(20) NOT NULL, 
     last_name VARCHAR (20) NOT NULL, 
     street_name VARCHAR (30) NOT NULL, 
     street_number SMALLINT(3) NOT NULL, 
     zip MEDIUMINT(5) NOT NULL, 
     city VARCHAR(20) NOT NULL 
    ); 


-- Create table first_names 
CREATE TABLE first_names (
    first_name_id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, 
    first_name VARCHAR(20) NOT NULL 
); 

Source C:\Database\Inlamning\first_names.txt 


-- Create table last_names 
CREATE TABLE last_names (
    last_name_id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, 
    last_name VARCHAR(20) NOT NULL 
); 

Source C:\Database\Inlamning\last_names.txt 


-- Create table street_names 
CREATE TABLE street_names (
    street_name_id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, 
    street_name VARCHAR(30) NOT NULL 
); 

Source C:\Database\Inlamning\street_names.txt 


/* 
* Create PRECEDURE "generate_adress" 
*/ 
DROP PROCEDURE IF EXISTS generate_adress; 

DELIMITER $$ 

CREATE PROCEDURE generate_adress(x INT, fn VARCHAR(20), ln VARCHAR(20), sn VARCHAR (30), snno SMALLINT(3), zi MEDIUMINT(5), ci VARCHAR(20)) 

    BEGIN 
    SELECT (SELECT CONCAT("generate_adress", NOW())) as "Start"; 

    IF (x > 100000) THEN 
    SELECT ("Max allowed adresser are 100000, value set to 100000") AS "Number of address:"; 
    SET x = 100000; 
    END IF; 

    INSERT INTO "t" (first_name, last_name, street_name, street_number, zip, city) 

    END$$ 

DELIMITER ; 



CALL generate_adress(1000); 

SELECT * FROM t; 

幫助,將不勝感激!

回答

0

我結束了這個解決方案!感謝您接受我的幫助!

/************************************************* 
* 
* Andreas Ekman Newton Java 2 
* 
* CREATE -- Source C:\Database\Test\CREATE.txt 
* File: -- Source C:\Database\Inlamning\first_names.txt - 358 Unique ID 
* File: -- Source C:\Database\Inlamning\last_names.txt - 359 Unique ID 
* File: -- Source C:\Database\Inlamning\street_names.txt - 335 Unique ID 
* File: -- Source C:\Database\Inlamning\street_numbers.txt - 300 Uniqe ID 
* File: -- Source C:\Database\Inlamning\zips.txt - 7 Uniqe ID 
* File: -- Source C:\Database\Inlamning\cities.txt - 7 Uniqe ID 
* 
**************************************************/ 
/* 
* Setting database to "Gamers" 
*/ 
USE Gamers; 

/* 
* Creating new tables 
*/ 
-- Create table t 
DROP TABLE IF EXISTS t; 
CREATE TABLE t(
    player_id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, 
    first_name VARCHAR(20) NOT NULL, 
    last_name VARCHAR (20) NOT NULL, 
    street_name VARCHAR (30) NOT NULL, 
    street_number SMALLINT(3) NOT NULL, 
    zip MEDIUMINT(5) NOT NULL, 
    city VARCHAR(20) NOT NULL 
    ); 


-- Create table first_names 
DROP TABLE IF EXISTS first_names; 
CREATE TABLE first_names (
    first_name_id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, 
    first_name VARCHAR(20) NOT NULL 
    ); 

Source C:\Database\Inlamning\first_names.txt 


-- Create table last_names 
DROP TABLE IF EXISTS last_names; 
CREATE TABLE last_names (
    last_name_id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, 
    last_name VARCHAR(20) NOT NULL 
    ); 

Source C:\Database\Inlamning\last_names.txt 


-- Create table street_names 
DROP TABLE IF EXISTS street_names; 
CREATE TABLE street_names (
    street_name_id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, 
    street_name VARCHAR(30) NOT NULL 
    ); 

Source C:\Database\Inlamning\street_names.txt 


-- Create table street_numbers 
DROP TABLE IF EXISTS street_numbers; 
CREATE TABLE street_numbers (
    street_number_id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, 
    street_number SMALLINT(30) NOT NULL 
    ); 

Source C:\Database\Inlamning\street_numbers.txt 


-- Create table zip 
DROP TABLE IF EXISTS zips; 
CREATE TABLE zips (
    zip_id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, 
    zip MEDIUMINT(5) NOT NULL 
    ); 

Source C:\Database\Inlamning\zips.txt 


-- Create table citites 
DROP TABLE IF EXISTS cities; 
CREATE TABLE cities (
    city_id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, 
    city VARCHAR(20) NOT NULL 
    ); 

Source C:\Database\Inlamning\cities.txt 


/* 
* Create PRECEDURE "generate_adress" 
*/ 
DROP PROCEDURE IF EXISTS generate_adress; 

DELIMITER $$ 

-- CREATE PROCEDURE generate_adress(x INT) 
CREATE PROCEDURE generate_adress(x INT) 
    BEGIN 
     -- Declaring variables 
     DECLARE i INT DEFAULT 1; 
     DECLARE j INT DEFAULT 1; 
     DECLARE k INT DEFAULT 1; 
     DECLARE fname VARCHAR(20) DEFAULT 'error'; 
     DECLARE lname VARCHAR(20) DEFAULT 'error'; 
     DECLARE stname VARCHAR(30) DEFAULT 'error'; 
     DECLARE stno SMALLINT(3) DEFAULT '0'; 
     DECLARE zi MEDIUMINT(5) DEFAULT '0'; 
     DECLARE ci VARCHAR(20) DEFAULT 'error'; 

     -- Visualizing the start of generator 
     SELECT (SELECT CONCAT("generate_adress", NOW())) as "Start generator!"; 

     -- Check call ID, max allowed input is 100000 
     IF (x > 100000) THEN 
      SELECT ("Max allowed addresses are 100000, value set to 100000") AS "Number of adresses"; 
      SET x = 100000; 
     END IF; 

     -- Loop for creating inserts to table "t" 
     WHILE (i <=x) DO 
      -- Setting random value for numbers in the 100's range 
      SET @random = FLOOR((RAND()*300 +1)); 
      -- Setting random value for numbers in the up to 7's range 
      SET @randomci = FLOOR((RAND()*7 +1)); 

      -- Getting random name from first_names table 
      SET fname = (SELECT first_name FROM first_names WHERE first_name_id = @random); -- SELECT (fname) as 'first_name'; 

      -- Getting random last name from last_names table 
      SET lname = (SELECT last_name FROM last_names WHERE last_name_id = @random); 

      -- Getting street name by ID = k 
      SET stname = (SELECT street_name FROM street_names WHERE street_name_id = k); 

      -- Getting street name by ID = j 
      SET stno = (SELECT street_number FROM street_numbers WHERE street_number_id = j); 

      -- Getting a random area code from zips table 
      SET zi = (SELECT zip FROM zips WHERE zip_id = @randomci); 

      -- Getting a random city from cities table 
      SET ci = (SELECT city FROM cities WHERE city_id = @randomci); 

      -- Insert data to table called "t" 
      INSERT INTO t (first_name, last_name, street_name, street_number, zip, city) VALUES(fname, lname, stname, stno, zi, ci); 

      -- Setting the "call generate_adress" counter to tick 
      SET i = i+1; 

      -- Setting street_name and street_number tick 
      SET j = j+1; 

      -- Variable counter 
      IF (j > 300) THEN 
       SET j = 1; 
       SET k = k+1; 
      END IF; 

     -- End of while loop   
     END WHILE; 

    -- Visualizing the start of generator 
    SELECT (SELECT CONCAT("generate_adress", NOW())) as "Stop generator!"; 

    -- End of create procedure 
    END$$ 

-- Setting default Delimiter to ; 
DELIMITER ; 

-- Call command, innout "x" for creating number of x's adresses 
CALL generate_adress(1000); 

-- View all created addresses 
SELECT * FROM t; 
0

我建議以下高電平僞代碼,可以再它代碼作爲線SQL或使用遊標SP,和/或使用臨時表或通過使用子查詢保存代碼等:

1-交叉連接姓氏和名字,這將給你250000行的所有可能的唯一名稱

2-交叉連接街道名稱與表中包含數字從1到300,這將給你100500行的唯一地址

3-從RAND()(temp table T1)排序的第一個交叉連接中選擇n行

0123從所述第二橫個

4-選擇n行由RAND()(臨時表T2)

5-加入上行號T1和T2,這將是您的n獨特行

的結果聯接有序該郵政編碼可以算出100000 * RAND()

編輯

僞多一點闡述:

set @rownum=0 
create table t1 as 
(
select @rownum:[email protected]+1 as rownum, x.* 
from (select firstname, lastname from firstnames, lastnames) as x limit 10 
) x1 

set @rownum=0 
create table t2 as 
(
select @rownum:[email protected]+1 as rownum, x.* 
from (select number, streetname from streetnames, numbers) as x limit 10 
) x1 

select * from t1 join t2 on t1.rownum=t2.rownum 
+0

嗯,這不'真的看起來很有效。首先我並不需要獨特的名字。我只想調用我的方法,如「CALL generate(5)」,它會生成5行數據。如果我刪除列的ID,數據應該仍然是唯一的,並且通過街道和交叉連接實現。 此外,我不想交叉連接100500街道和名稱每次執行創建腳本,所以我需要一個解決方案,以更新我在CALL(N)中放置的N值。 我真的很新,所以難以翻譯僞代碼,找不到任何相關的問題 –

+0

你不需要通過250000的100500地址,你只需要從每個表中選擇N行然後加入行號或者在N次迭代的一個while循環中選擇其中的一個。名稱(500x500)和地址(335x300)的交叉連接應該很快。 – Jayvee

+0

他們需要一些時間,但這可能是它應該如何。如何爲此編寫while循環? –

相關問題