2015-10-19 5 views
1

Я putzing вокруг с SQL, пытаясь получить лучшее представление о моем использовании этого, это было хорошо, пока я не добрался до этой строки кода: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 

Я не уверен, что я сделал, но код продолжает бесконечно. я хотел, чтобы он вставлял только пару записей, но сейчас он вставлен более чем на 5 миллионов записей.

, потому что люди просят его здесь тип данных для каждого столбца:

чид INT (11)

Fname текст

LName текст

пол перечисление ("мужчина ',' female ')

масса, психоз, скинк, статус и концепцияПредставить все INT

is_pregnant перечисления («да», «нет»)

некоторые из них получает обновление/переименованный (статус имени теперь rStatus и is_pregnant имеет третий вариант для «in_labor»), но это не должны» t воздействует на что-либо еще.

+0

Я никогда не видел предел используется в комбинации с выбором для вставки. Что в стороне, сколько записей в именах и именах соответственно? так как с этим выбором вы объединяете все возможные комбинации обоих ... и если мы возьмем даже 1000 записей .......... это закончится тем, что будет QUITE в LOT-записи (1000000, если я не ошибаюсь) – Thomas

+0

Я думаю, что предел был с консоли phpmyadmin. Тем не менее, есть намного меньше комбо, чем вставляются (также, насколько я могу судить, нет данных, которые фактически вставляются, в нем говорится ~ 2 899 478 123 записи, но когда я нажимаю на представление базы данных, ничего нет в нем) –

+0

в соответствии с таблицей def у вас есть несколько возможных проблем. 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

Поскольку вы используете крест присоединиться будет п * м запись будет там (где п нет строк в LName и не где т нет. Строк в имя_файле).

Таким образом, будет полезно использовать '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

thats right .. i modifiedthe ответ –

0

если "conceptionDate" столбец - varchar/тип даты column. Если вы вставляете '1' в "conceptionDate" в качестве столбца даты, это приведет к ошибке.

Fiddle Demo

+0

дата зачатия - всего лишь INT. это для игры с пользовательским временным масштабом, поэтому мне нужно было по-настоящему изобретать часы. –

+0

@PatrickPierson вы можете поднять тип данных в каждом столбце? (в ваш вопрос) – Thomas

+0

@ Томас сделал и сделал. –