Как вставить новые данные или обновить, если они уже существуют - PullRequest
0 голосов
/ 12 июля 2020

Я смотрел на этот вопрос / ответ здесь: Вставить в таблицу MySQL или обновить, если существует , но я запутался. У меня есть эта таблица (клиенты):

cus_id | driver_id | name   | age
1      | 1234      | Bob    | 20
2      | 987       | James  | 21
3      | 5000      | Jane   | 23

SQL

CREATE TABLE customers(
cus_id int(4) NOT NULL AUTO_INCREMENT PRIMARY KEY,
driver_id int(4) NOT NULL,
name varchar(32),
age int(3)
);

Я всегда ищу через driver_id. cus_id - это первичный ключ, а AUTO_INCREMENT. И всегда обновляйте name и age.

Поэтому я бы использовал оператор

INSERT INTO customers (driver_id, name, age) VALUES(1234, "Bobby", 21) ON DUPLICATE KEY UPDATE    
name="Bobby", age=21

Теперь проблема в том, что такое DUPLICATE KEY? Я не ищу дубликат через cus_id. Я ищу дубликат своих driver_id.

Итак, в приведенном выше заявлении он обновит строку с помощью cus_id=1, а не вставит строку, потому что driver_id 1234 уже существует.

Итак, таблица будет выглядеть так:

cus_id | driver_id | name   | age
1      | 1234      | Bobby  | 21
2      | 987       | James  | 21
3      | 5000      | Jane   | 23

Ответы [ 2 ]

1 голос
/ 12 июля 2020

Вот ваш образец:

Создайте таблицу

MariaDB [bernd]> CREATE TABLE customers (
                   cus_id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
                   driver_id INT(11),
                   name VARCHAR(32),
                   age int(11)
                );
                Query OK, 0 rows affected (0.01 sec)

Теперь вставьте данные

    MariaDB [bernd]> INSERT INTO customers (driver_id,name,age) VALUES
     (1234,'Bob',20),
     (987,'James',21),
     (5000,'Jane',23);
    Query OK, 3 rows affected (0.00 sec)
    Records: 3  Duplicates: 0  Warnings: 0

Наблюдать за данными

MariaDB [bernd]> SELECT * FROM customers;
+--------+-----------+-------+------+
| cus_id | driver_id | name  | age  |
+--------+-----------+-------+------+
|      1 |      1234 | Bob   |   20 |
|      2 |       987 | James |   21 |
|      3 |      5000 | Jane  |   23 |
+--------+-----------+-------+------+
3 rows in set (0.00 sec)

ДОБАВИТЬ уникальный ключ

MariaDB [bernd]> ALTER TABLE customers ADD UNIQUE (driver_id);
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

Вы также можете добавить ключ напрямую с помощью СОЗДАТЬ ТАБЛИЦУ Заявление

Вставить запись с повторяющимся идентификатором драйвера

MariaDB [bernd]> INSERT INTO customers (driver_id, name, age) VALUES(1234, "Bobby", 21) ON DUPLICATE KEY UPDATE
    -> name="Bobby", age=21;
Query OK, 2 rows affected (0.01 sec)

Наблюдать за измененными данными

MariaDB [bernd]> SELECT * FROM customers;
+--------+-----------+-------+------+
| cus_id | driver_id | name  | age  |
+--------+-----------+-------+------+
|      1 |      1234 | Bobby |   21 |
|      2 |       987 | James |   21 |
|      3 |      5000 | Jane  |   23 |
+--------+-----------+-------+------+
3 rows in set (0.00 sec)
0 голосов
/ 12 июля 2020

Теперь проблема в том, что такое DUPLICATE KEY?

В определении вашей таблицы есть только один ключ, cus_id. И он автоматически увеличивается, поэтому его нельзя дублировать - в конце концов, оператор insert должен позволять базе данных выбирать следующее значение.

Если вы хотите, чтобы driver_id был уникальным, вы требуется уникальное ограничение или индекс для этого столбца. Самый простой способ - создать таблицу:

CREATE TABLE customers (
    cus_id int(4) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    driver_id int(4) NOT NULL UNIQUE
    name varchar(32),
    age int(3)
);

Однако вы также можете добавить ее постфактум как уникальное ограничение или индекс:

alter table customers add constraint unq_customers_driver_id unique(driver_id);

Или альтернативно:

create unique index unq_customers_driver_id on customers(driver_id);

К сожалению, MySQL не позволяет вам «выбирать», какой дублированный ключ будет обрабатываться. Любой дублированный ключ запускает ON DUPLICATE KEY UPDATE logi c.

...