Массовая вставка / обновление MySQL

0

скажем, я хочу выполнить следующую mysql, и в таблице уже есть несколько записей, и может быть более одной записи, которая уже существует. если эта запись (21,'Helen','a') и (21,'Hui Ling','b') уже существуют в таблице, и я хочу выполнить вставку и обновление с такими условиями, как.. where name = "Helen" and grade="a" то какая должна быть часть моего запроса на обновление.

INSERT INTO students (points,name,grade)
    VALUES
    (21,'Helen','b'),
    (21,'Helen','c' ),
    (21,'Samia','a'),
    (21,'Hui Ling','b'),
    (21,'Yumie','a'),
    (21,'Helen','a')
ON DUPLICATE KEY UPDATE
    grade = VALUES('a'),
  • 0
    Какие ключи у вас есть на студентов?
  • 0
    Я не совсем понимаю вашу логику - если у вас есть Хелен, а затем попытайтесь вставить Хелен, б, то это следует сделать, но если вы попытаетесь вставить Хелен, то не должно? Что бы вы ожидали, что ваши окончательные значения для Елены будут после всех вставок?
Показать ещё 7 комментариев
Теги:
sql-update

2 ответа

0

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

MariaDB [sandbox]> drop table if exists students;
Query OK, 0 rows affected (0.17 sec)

MariaDB [sandbox]> create table students
    ->  (id int auto_increment primary key,points int,name varchar(20),grade varchar(1));
Query OK, 0 rows affected (0.19 sec)

MariaDB [sandbox]>
MariaDB [sandbox]> INSERT INTO students (points,name,grade)
    ->     VALUES
    ->     (21,'Helen','b'),
    ->     (21,'Helen','c' ),
    ->     (21,'Samia','a'),
    ->     (21,'Hui Ling','b'),
    ->     (21,'Yumie','a'),
    ->     (21,'Helen','a'),
    ->     (22,'Helen','z')
    -> ON DUPLICATE KEY UPDATE
    ->     grade = VALUES(grade);
Query OK, 7 rows affected (0.02 sec)
Records: 7  Duplicates: 0  Warnings: 0

MariaDB [sandbox]>
MariaDB [sandbox]> select * from students;
+----+--------+----------+-------+
| id | points | name     | grade |
+----+--------+----------+-------+
|  1 |     21 | Helen    | b     |
|  2 |     21 | Helen    | c     |
|  3 |     21 | Samia    | a     |
|  4 |     21 | Hui Ling | b     |
|  5 |     21 | Yumie    | a     |
|  6 |     21 | Helen    | a     |
|  7 |     22 | Helen    | z     |
+----+--------+----------+-------+
7 rows in set (0.00 sec)

MariaDB [sandbox]>
MariaDB [sandbox]> truncate table students;
Query OK, 0 rows affected (0.23 sec)

MariaDB [sandbox]> alter table students
    -> add unique key studentsk1(name,points);
Query OK, 0 rows affected (0.16 sec)
Records: 0  Duplicates: 0  Warnings: 0

MariaDB [sandbox]> INSERT INTO students (points,name,grade)
    ->     VALUES
    ->     (21,'Helen','b'),
    ->     (21,'Helen','c' ),
    ->     (21,'Samia','a'),
    ->     (21,'Hui Ling','b'),
    ->     (21,'Yumie','a'),
    ->     (21,'Helen','a'),
    ->     (22,'Helen','z')
    -> ON DUPLICATE KEY UPDATE
    ->     grade = VALUES(grade);
Query OK, 9 rows affected (0.02 sec)
Records: 7  Duplicates: 2  Warnings: 0

MariaDB [sandbox]>
MariaDB [sandbox]> select * from students;
+----+--------+----------+-------+
| id | points | name     | grade |
+----+--------+----------+-------+
|  1 |     21 | Helen    | a     |
|  2 |     21 | Samia    | a     |
|  3 |     21 | Hui Ling | b     |
|  4 |     21 | Yumie    | a     |
|  5 |     22 | Helen    | z     |
+----+--------+----------+-------+
5 rows in set (0.00 sec)

Обратите внимание, что в первой вставке, что helen дублируется, потому что нет уникального ключа для ключа ON DUPLICATE KEY для тестирования. После того, как таблица изменений добавит уникальный ключ, следующая вставка обнаруживает дубликаты ключей, работает как и ожидалось.

0

Если я правильно понимаю, вы хотите установить grade в то, что передано. Вы хотите использовать конструкцию VALUES():

INSERT INTO students (points, name, grade)
    VALUES
        (21,'Helen','b'),
        (21,'Helen','c' ),
        (21,'Samia','a'),
        (21,'Hui Ling','b'),
        (21,'Yumie','a'),
        (21,'Helen','a')
    ON DUPLICATE KEY UPDATE grade = VALUES(grade);

Это будет произвольно выбирать одно из значений для таблицы. Вот скрипт SQL.

  • 0
    Что делать, если есть 2 записи с одинаковыми именами, но точки разные, и я хочу сохранить обе записи в таблице, и только я хочу обновить, где name = 'Helen' и grade = 'c' и name = 'Yumie' и grade = ' а»

Ещё вопросы

Сообщество Overcoder
Наверх
Меню