Попробуйте использовать команду Insert для обновления дубликатов ключей в MYSQL, но в одной таблице нет PK

#mysql

#mysql

Вопрос:

У меня есть две таблицы :

Таблица MST:

 ID     (PK INT)
Content (Varchar255)
NAME    (Varchar255)
  

Таблица STG:

 ID     (INT)                 * not Primary Key
Content (Varchar255)
NAME    (Varchar255)
  

Тогда как я могу вставить данные из STG в таблицу MST, если в ID есть дубликат, я обновлю остальные столбцы или вставлю новые строки.

Комментарии:

1. Проверка дубликатов ключей применяется ТОЛЬКО к целевой таблице.

Ответ №1:

Не имеет значения, имеет ли источник PK / UNIQUE . Каждая отдельная вставка выполняет отдельную и независимую проверку только для целевой таблицы.

Но у вас должен быть определенный порядок исходных данных — от этого зависит результат.

ДЕМОНСТРАЦИОННАЯ скрипка — разный порядок приводит к другому результату.

Ответ №2:

У меня есть метод, в котором вы можете вставлять данные в MTG, но дубликат ID не будет вставлен в MTG

Сначала мы создаем таблицу

 create table MTG like STG;
  

Это создаст таблицу, подобную STG, но не будет вставлять в нее записи.
Помните, что только столбцы, их атрибуты и ограничения копируются с помощью like предложения using .

 desc MTG;
 --------- -------------- ------ ----- --------- ------- 
| Field   | Type         | Null | Key | Default | Extra |
 --------- -------------- ------ ----- --------- ------- 
| ID      | int          | YES  |     | NULL    |       |
| content | varchar(225) | YES  |     | NULL    |       |
| Name    | varchar(225) | YES  |     | NULL    |       |
 --------- -------------- ------ ----- --------- ------- 
  

Затем мы модифицируем MTG столбец ID , чтобы сделать его primary key

 alter table MTG modify id int primary key;
  

Я вставил некоторые поддельные данные в STG, которые похожи:

 select * from STG;
 ------ --------- --------- 
| ID   | content | Name    |
 ------ --------- --------- 
|    1 | FUN     | Swap    |
|    1 | Vines   | Swapnil |
|    2 | dint    | Raj     |
 ------ --------- --------- 
  

Как только мы запустим запрос ниже

 insert ignore into MTG select * from STG;
  

Он будет игнорировать повторяющиеся записи.
как вы можете видеть

  ---- --------- ------ 
| id | content | Name |
 ---- --------- ------ 
|  1 | FUN     | Swap |
|  2 | dint    | Raj  |
 ---- --------- ------