En MySql, estos cuatro métodos pueden evitar la inserción repetida de datos.

Prefacio

En el caso de un conflicto de clave primaria MySql o un conflicto de clave única, de acuerdo con el método de inserción, generalmente existen los siguientes cuatro métodos de inserción para evitar errores.

  1. insertar ignorar。

  2. reemplazar en

  3. insertar en la actualización de clave duplicada


insertar ignorar

insert ignore ignorará los datos que ya existen en la base de datos. De acuerdo con la clave principal o índice único, si no hay datos en la base de datos, se insertarán nuevos datos. Si hay datos, se omitirán.

Pequeña caja:

Estructura de la tabla

root:test> show create table t3G
*************************** 1. row ***************************
       Table: t3
Create Table: CREATE TABLE `t3` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `c1` int(11) DEFAULT NULL,
  `c2` varchar(20) DEFAULT NULL,
  `c3` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uidx_c1` (`c1`)
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

root:test> select * from t3;
    +----+------+------+------+
    | id | c1   | c2   | c3   |
    +----+------+------+------+
    |  1 |    1 | a    |    1 |
    |  2 |    2 | a    |    1 |
    |  8 | NULL | NULL |    1 |
    | 14 |    4 | bb   | NULL |
    | 17 |    5 | cc   |    4 |
    +----+------+------+------+
    5 rows in set (0.00 sec)

Insertar datos contradictorios

root:test> insert ignore into t3 (c1,c2,c3) values(5,'cc',4),(6,'dd',5);     Query OK, 1 row affected, 1 warning (0.01 sec)
Records: 2  Duplicates: 1  Warnings: 1

Ver resultados

root:test> show warnings;
+---------+------+---------------------------------------+
| Level   | Code | Message                               |
+---------+------+---------------------------------------+
| Warning | 1062 | Duplicate entry '5' for key 'uidx_c1' |
+---------+------+---------------------------------------+
1 row in set (0.00 sec)

root:test> select * from t3;
+----+------+------+------+
| id | c1   | c2   | c3   |
+----+------+------+------+
|  1 |    1 | a    |    1 |
|  2 |    2 | a    |    1 |
|  8 | NULL | NULL |    1 |
| 14 |    4 | bb   | NULL |
| 17 |    5 | cc   |    4 |
| 18 |    6 | dd   |    5 |
+----+------+------+------+
6 rows in set (0.00 sec)


reemplazar en

reemplazar en intentará insertar datos primero y eliminarlos si se encuentran conflictos. De lo contrario, no haga nada.


Pequeña caja:

root:test> show create table t3G
*************************** 1. row ***************************
       Table: t3
Create Table: CREATE TABLE `t3` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `c1` int(11) DEFAULT NULL,
  `c2` varchar(20) DEFAULT NULL,
  `c3` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uidx_c1` (`c1`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

root:test> select * from t3;
+----+------+--------+------+
| id | c1   | c2     | c3   |
+----+------+--------+------+
|  1 |    1 | cc     |    4 |
|  2 |    2 | dd     |    5 |
|  3 |    3 | qwewqe |    3 |
+----+------+--------+------+
3 rows in set (0.00 sec)

Insertar datos contradictorios

root:test> replace into t3 (c1,c2,c3) values(3,'new',8);
Query OK, 2 rows affected (0.02 sec)

root:test> select * from t3;
+----+------+------+------+
| id | c1   | c2   | c3   |
+----+------+------+------+
|  1 |    1 | cc   |    4 |
|  2 |    2 | dd   |    5 |
|  4 |    3 | new  |    8 |
+----+------+------+------+
3 rows in set (0.00 sec)

Puede ver que el registro original se ha ido y el nuevo registro está allí.


insertar en la actualización de clave duplicada

Si se especifica insertar en la actualización de clave duplicada al final de la instrucción Insertar en, si hay valores duplicados, la actualización se realizará después de que aparezcan los valores duplicados.

caso:

root:test> show create table t3G
*************************** 1. row ***************************
       Table: t3
Create Table: CREATE TABLE `t3` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `c1` int(11) DEFAULT NULL,
  `c2` varchar(20) DEFAULT NULL,
  `c3` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uidx_c1` (`c1`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

root:test> select * from t3;
+----+------+------+------+
| id | c1   | c2   | c3   |
+----+------+------+------+
|  1 |    1 | fds  |    4 |
|  2 |    2 | ytu  |    3 |
|  3 |    3 | czx  |    5 |
+----+------+------+------+
3 rows in set (0.00 sec)

Inserte un dato que entre en conflicto con la clave única (columna c1) del registro id = 3

root:test> insert into t3(c1,c2,c3) values (3,'new',5) on duplicate key update c1=c1+3;
Query OK, 2 rows affected (0.01 sec)

root:test> select * from t3;
+----+------+------+------+
| id | c1   | c2   | c3   |
+----+------+------+------+
|  1 |    1 | fds  |    4 |
|  2 |    2 | ytu  |    3 |
|  3 |    6 | czx  |    5 |
+----+------+------+------+
3 rows in set (0.00 sec)

Puede ver que el registro con id = 3 ha cambiado, c1 = el c1 + 3 original y las otras columnas no han cambiado.

No hay manera, pero la técnica se puede lograr; si no hay manera, termina con la técnica.

Bienvenidos a todos a seguir la cuenta pública de Java Way

Buen artículo, estoy leyendo ❤️

Supongo que te gusta

Origin blog.csdn.net/hollis_chuang/article/details/108633417
Recomendado
Clasificación