скажем, я хочу выполнить следующую 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'),
Я не совсем понимаю, что вы хотите здесь, но вам почти наверняка нужно смотреть на свои ключи, например
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 для тестирования. После того, как таблица изменений добавит уникальный ключ, следующая вставка обнаруживает дубликаты ключей, работает как и ожидалось.
Если я правильно понимаю, вы хотите установить 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.