2015-10-19 45 views
1

我一直在用sql putzing周圍,試圖讓我對它的使用更好的把握,這是順利,直到我得到這行代碼:SQL INSERT ... SELECT繼續無限期地插入

INSERT INTO 
citizens(lName,fName,gender,weight,psychosis,skank,status,is_pregnant,conceptionDate) 
SELECT l.lastname, f.name, f.gender, '1','1','1','1','1','1' FROM firstNames f, lastName l 
LIMIT 1 

我不確定我做了什麼,但代碼繼續在infinium中。我希望它只插入幾條記錄,但現在插入的記錄超過500萬條。

,因爲人們都在問它在這裏是每一列的數據類型:

CID INT(11)

FNAME文本

LNAME文本

性別枚舉('男','女')

體重,精神病,skank,狀態和ConceptionDate全部INT

is_pregnant枚舉(「是」,「否」)

一些是獲得更新/重命名(名稱狀態現在RSTATUS和is_pregnant有「in_labor」第三個選項),但不應該」沒有其他影響。

+0

我從來沒有見過限制與插入的選擇組合使用。除了名字和姓氏分別有多少個條目?就像你選擇的那樣,你將所有可能的組合都組合起來......如果我們甚至需要1000個條目..........它最終會在那裏確定一個LOT條目(如果我沒有弄錯,則爲1000000條) – Thomas

+0

我認爲phpmyadmin控制檯的限制是存在的。也就是說,插入的組合比插入的組合要少得多(也就是說,據我所知,似乎沒有實際插入的數據,它說〜2,899,478,123個條目,但是當我點擊數據庫視圖時,沒有任何東西在裏面) –

+0

根據表def你有幾個可能的probs。 int blockls應該被設置爲1而不是'1'。另外我不確定is_pregnant enum是否喜歡它,如果你把'1'作爲值。 cid是一個自動增量(我認爲它是主鍵)? – Thomas

回答

0

您錯過了加入您的表格。

SELECT l.lastname, f.name, f.gender, '1','1','1','1','1','1' 
FROM firstNames f INNER JOIN lastName l on f.someID = l.someID 
LIMIT 1 
+2

他正在參加他的表格。他正在交叉連接 – Drew

1

由於您使用的是交叉聯接將有N * M個條目會在那裏(行其中N沒有在L-NAME行和m是沒有。在FNAME)。

因此,使用'INNER JOIN'(如果名字和姓氏都是強制性的)或'LEFTJOIN'(如果姓氏不是強制性的)將是明智的。

INSERT INTO citizens(lName,fName,gender,weight,psychosis,skank,status,is_pregnant,conceptionDate) values (SELECT l.lastname, f.name, f.gender, '1','1','1','1','1','1' FROM firstNames f INNER JOIN lastName l ON f.id=l.id LIMIT 1)

希望這會起作用。

+1

內部連接,交叉連接取決於他想實現什麼(在這種情況下,他做了一個交叉連接,對於測試數據可以有其存在的權利,因此內部連接不一定是必需的) – Thomas

+0

那是正確的..我修改了答案 –

0

如果「conceptionDate」列是varchar/date類型列。 如果您在「conceptionDate」中插入'1'作爲日期列,那麼它會給您一個錯誤。

Fiddle Demo

+0

受孕日期只是一個INT。這是針對具有自定義時間尺度的遊戲,所以我需要重新創造時鐘。 –

+0

@PatrickPierson你可以提出每列的數據類型是什麼? (進入你的問題) – Thomas

+0

@Thomas完成並完成。 –