Mysql для вставки и обновления нескольких полей на основе двух таблиц

#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, поскольку я явно не хочу удалять какую-либо информацию, уже находящуюся в строке, связанной с ПЕРВИЧНЫМ ключом.