#mysql
#mysql
Вопрос:
У меня есть запрос INSERT SELECT с CASE WHEN THEN, но, похоже, его запуск является проблемой. Я получаю:
Код ошибки: 2013. Потерянное соединение с сервером MySQL во время запроса Код ошибки: 1205. Превышен тайм-аут ожидания блокировки; попробуйте перезапустить транзакцию
Что я могу использовать вместо CASE WHEN THEN?
Мне нужно вставить идентификаторы в столбцы degree_type_id
, marital_status_id
, employment_field_id
. Я выбираю из таблиц:
- new_coders_survey_data,
- dw_time_dim
Есть ли другой способ вставить идентификационные номера в мою таблицу ФАКТОВ ( dw_coder_fact
) в эти 3 столбца?
У меня есть таблицы:
dw_marital_status_dim
dw_education_dim
dw_employment_field_dim
У них есть 2 столбца: 1) идентификатор, 2) описание
С уважением, Анна
INSERT INTO dw_coder_fact
(age,
gender,
country_citizen,
country_live,
city_population,
is_ethnic_minority,
language_at_home,
degree_type_id,
school_major,
marital_status_id,
has_children,
children_number,
employment_status,
employment_field_id,
is_software_dev,
months_programming,
is_underemployed,
income,
survey_date,
date_id,
attended_bootcamp,
bootcamp_fulljob_after,
bootcamp_postsalary,
hours_learning,
bootcamploanyesno,
money_for_learning,
has_student_debt,
student_debt_owe,
has_debt,
has_home_mortgage,
home_mortgage_owe,
financially_supporting,
has_financially_dependents,
job_apply_when,
type_of_company_pref,
job_role_interest,
job_where_pref,
expected_earning)
SELECT s.age,
s.gender,
s.countrycitizen,
s.countrylive,
s.citypopulation,
s.isethnicminority,
s.languageathome,
CASE s.schooldegree
WHEN "associate's degree" THEN 1
WHEN "bachelor's degree" THEN 2
WHEN 'high school diploma or equivalent (GED)' THEN 3
WHEN "master's degree (non-professional)" THEN 4
WHEN 'no high school (secondary school)' THEN 5
WHEN 'Ph.D.' THEN 6
WHEN 'professional degree (MBA, MD, JD, etc.)' THEN 7
WHEN 'some college credit, no degree' THEN 8
WHEN 'some high school' THEN 9
WHEN 'trade, technical. or vocational training' THEN 10
ELSE 11
end AS DegreeTypeDescription,
s.schoolmajor,
CASE s.maritalstatus
WHEN 'divorced' THEN 1
WHEN 'married or domestic partnership' THEN 2
WHEN 'separated' THEN 3
WHEN 'single, never married' THEN 4
WHEN 'widowed' THEN 5
ELSE 6
end AS MaritalStatusDescription,
s.haschildren,
s.childrennumber,
s.employmentstatus,
CASE s.employmentfield
WHEN 'architecture or physical engineering' THEN 1
WHEN 'arts, entertainmant, sports, or media' THEN 2
WHEN 'constraction and extraction' THEN 3
WHEN 'education' THEN 4
WHEN 'farming, fishing, and forestry' THEN 5
WHEN 'finance' THEN 6
WHEN 'food and beverage' THEN 7
WHEN 'health care' THEN 8
WHEN 'law enforcement and fire and rescue' THEN 9
WHEN 'legal' THEN 10
WHEN 'office and administrative support' THEN 11
WHEN 'sales' THEN 12
WHEN 'software development' THEN 13
WHEN 'software development and IT' THEN 14
WHEN 'transportation' THEN 15
ELSE 16
end AS EmploymentFieldDescription,
s.issoftwaredev,
s.monthsprogramming,
s.isunderemployed,
s.income,
s.part1starttime,
t.date_id,
s.attendedbootcamp,
s.bootcampfulljobafter,
s.bootcamppostsalary,
s.hourslearning,
s.bootcamploanyesno,
s.moneyforlearning,
s.hasstudentdebt,
s.studentdebtowe,
s.hasdebt,
s.hashomemortgage,
s.homemortgageowe,
s.financiallysupporting,
s.hasfinancialdependents,
s.jobapplywhen,
s.jobpref,
s.jobroleinterest,
s.jobwherepref,
s.expectedearning
FROM new_coders_survey_data s,
dw_time_dim t;
Комментарии:
1. У вас есть соединение через запятую без условия where — вы намеревались вставить декартово произведение? и из интереса, сколько записей в new_coders_survey_data и dw_time_dim?
2. П.Салмон, что такое соединение запятой? У меня есть пустая таблица, и я пытаюсь вставить в нее значения из 2 других таблиц. Это 33 787 записей в new_coders_survey_data и 33 787 записей в dw_time_dim. Я не знаю, что такое декартово произведение..
3. Затем вам нужно провести небольшое исследование — соединение через запятую сгенерирует 37787 * 37787 строк, что очень много (1427857369) ‘ВНУТРЕННЕЕ СОЕДИНЕНИЕ и , (запятая) семантически эквивалентны при отсутствии условия соединения: оба создают декартово произведение между указанными таблицами (то есть каждая строка в первой таблице присоединяется к каждой строке во второй таблице). dev.mysql.com/doc/refman/8.0/en/join.html ваше соединение через запятую ИЗ new_coders_survey_data s, dw_time_dim t;
4. @Anna Почему у вас две таблицы в
FROM
предложении? Вы хотите объединить все строки из первой таблицы со всеми строками из второй таблицы? Вероятно, нет; там должен быть предикат join.5. О, спасибо, теперь я это понимаю. добавлено, ГДЕ s.Part1StartTime = t.survey_date_time limit 1; Я попытался вставить 1 запись, работает отлично. Но 5 строк выдают код ОШИБКИ: 2013. Потерянное соединение с сервером MySQL во время запроса. Я увеличил «интервал ожидания чтения соединения с СУБД» и «innodb_lock_wait_timeout». Ожидание ВСТАВКИ. Большое спасибо!!!!!!!!!!
Ответ №1:
Комментарии @P.Salmon уместны. Какова связь между вашей таблицей [new_coder_survey_data] и вашей таблицей [dw_time_dim] [new_coder_survey_data]? Похоже, что dw_time_dim записывает, когда был проведен опрос для получения данных, которые помещаются в new_coder_survey_data. Если это правильно, должен быть способ идентифицировать предмет опроса в обеих таблицах, обычно и поле id, хотя мы можем предположить, что использование полного имени, среди других альтернатив, также возможно. Если мои предположения верны, вам просто нужно установить внутреннее соединение между обеими таблицами как:
FROM new_coders_survey_data s
INNER JOIN dw_time_dim t
ON s.id = t.personid
или, если вам нужно сослаться на полное имя
FROM new_coders_survey_data s
INNER JOIN dw_time_dim t
ON s.fullname = t.personname
Я не нахожу ни одного поля в вашей таблице dw_coder_fact, которое позволяло бы идентифицировать человека, о котором идет речь (без идентификатора, без имени, без адреса).
В любом случае, присоединение к коме, которое у вас есть, потребует длительного времени обработки и ужасных усилий, чтобы оценить его.
Комментарии:
1. Спасибо. У меня есть общий столбец survey_date_time для объединения. Столбца coder_id здесь нет, так как это AUTO_INCREMENT. Большое спасибо!