#mysql #insert
#mysql #вставить
Вопрос:
Я пытаюсь вставлять поля в таблицу, когда нет совпадения по ПЕРВИЧНОМУ ключу Study_ID … и обновлять поля, если есть совпадение (чтобы не перезаписывать строку).
Моя текущая попытка:
INSERT INTO dataouts.all_diagnoses (Study_ID, ol1, ol2, ol3, ol4, ol5, ol6, ol7, ol8, ol9, ol10)
SELECT Study_ID, Provisional_Diagnosis_1, Provisional_Diagnosis_2, Provisional_Diagnosis_3,
Provisional_Diagnosis_4, Provisional_Diagnosis_5, Provisional_Diagnosis_6,
Provisional_Diagnosis_7, Provisional_Diagnosis_8, Provisional_Diagnosis_9,
Provisional_Diagnosis_10
FROM SurveyGizmo.SurveyExportAll
ON DUPLICATE KEY UPDATE values (ol1, ol2, ol3, ol4, ol5, ol6, ol7, ol8, ol9, ol10)
SELECT Study_ID, Provisional_Diagnosis_1, Provisional_Diagnosis_2, Provisional_Diagnosis_3,
Provisional_Diagnosis_4, Provisional_Diagnosis_5, Provisional_Diagnosis_6,
Provisional_Diagnosis_7, Provisional_Diagnosis_8, Provisional_Diagnosis_9,
Provisional_Diagnosis_10
FROM SurveyGizmo.SurveyExportAll;
Я знаю, что это неправильно, но мне было интересно, может ли кто-нибудь указать мне, как решить эту проблему, поскольку она уже некоторое время вызывает у меня головную боль!
Заранее спасибо
################
С немного большей настойчивостью… думаю, это работает :
insert into dataouts.all_diagnoses(Study_ID, ol1, ol2, ol3, ol4, ol5, ol6, ol7, ol8, ol9, ol10)
select t1.Study_ID, Provisional_Diagnosis_1, Provisional_Diagnosis_2, Provisional_Diagnosis_3,
Provisional_Diagnosis_4, Provisional_Diagnosis_5, Provisional_Diagnosis_6,
Provisional_Diagnosis_7, Provisional_Diagnosis_8, Provisional_Diagnosis_9,
Provisional_Diagnosis_10
from SurveyGizmo.SurveyExportAll t1 left outer join
dataouts.all_diagnoses t2
on t2.Study_ID = t1.Study_ID
on duplicate key update ol1 = t1.Provisional_Diagnosis_1,
ol2 = t1.Provisional_Diagnosis_2,
ol3 = t1.Provisional_Diagnosis_3,
ol4 = t1.Provisional_Diagnosis_4,
ol5 = t1.Provisional_Diagnosis_5,
ol6 = t1.Provisional_Diagnosis_6,
ol7 = t1.Provisional_Diagnosis_7,
ol8 = t1.Provisional_Diagnosis_8,
ol9 = t1.Provisional_Diagnosis_9,
ol10 = t1.Provisional_Diagnosis_10
;
Кажется, пока работает .. спасибо всем за любой ваш вклад.
Комментарии:
1. ODKU работает с одной строкой, а не с набором строк. Поэтому он не может содержать запрос SELECT, он должен состоять из множества операторов SET, которые присваивают значения отдельным столбцам строки, что приводит к дублированию нарушения.
2. С другой стороны — вы заменяете все значения полей старой записи новыми значениями — так
REPLACE INTO
что вместоINSERT INTO .. ODKU
этого может быть более безопасно.3. Спасибо, Акина … думаю, что моя доработка теперь работает без большого количества операторов обновления / установки. И я не могу использовать replace, поскольку я явно не хочу удалять какую-либо информацию, уже находящуюся в строке, связанной с ПЕРВИЧНЫМ ключом.