如果它是一个新数据,如何插入,如果它已经存在,如何更新

aelbi1ox  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(308)

我在这里看到了这个问题/答案:插入到mysql表或更新(如果存在),但我很困惑。我有这张table(顾客):

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

现在的问题是,什么是复制密钥?我不是通过 cus_id . 我在寻找我的复制品 driver_id .
所以在上面的语句中,它将用 cus_id=1 ,不插入行,因为
driver_id 1234 已经存在。
所以这张table看起来像:

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

fnx2tebb1#

这是您的样品:
创建表

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

也可以使用createtable语句直接添加键
插入具有重复驱动程序id的记录

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)
yks3o0rb

yks3o0rb2#

现在的问题是,什么是复制密钥?
表定义只有一个键, 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 逻辑。

相关问题