澳门新葡萄京娱乐网站-澳门新葡萄京888官网-所有平台

热门关键词: 澳门新葡萄京娱乐网站,澳门新葡萄京888官网

MySQL避免插入重复记录的方法,如何随机排列数字

作者: 澳门新葡萄京娱乐网站  发布:2019-12-21

createtable#t(idint)insert#tselect1insert#tselect2insert#tselect3insert#tselect4insert#tselect5诸如表内有不固定、不重复的数字,倘诺将该表数据进行任性,不另行的整合譬喻1,2+3+4+51,2,3+4+51,2,3,4+5.....5,1+2+3+4

触发器用来兑将来永世表上进展一些操作时接触运营另风姿罗曼蒂克操作。

mysql在设有主键冲突或许唯生龙活虎键冲突的图景下,根据插入战术分化,常常常有以下两种防止形式。
1、insert ignore
2、replace into
3、insert on duplicate key update

1.成立触发器

以下是MariaDB中create trigger的语法:mysql不支持or replace和if not exists子句。

CREATE [OR REPLACE] TRIGGER [IF NOT EXISTS] trigger_name
    { BEFORE | AFTER } { INSERT | UPDATE | DELETE }
    ON tbl_name FOR EACH ROW
    trigger_body

触发器只好创立在恒久表上,不能够树立在视图和不常表上。MySQL/MariaDB中的触发器只支持行级触发器(即每行都触发一次触发器卡塔尔(قطر‎,不帮助数据库品级和服务器级其余触发器。MySQL/玛丽亚DB中的触发器尽管都以基于表的,却蕴藏在数据库下,精通那点很要紧,现在翻看、删除、引用trigger的时候都是通过数据库名称来援用的,并不是选用表来引用。

before和after是触发时间,insert/update/delete是接触事件。例如before insert澳门新葡萄京娱乐网站,意味着插入记录以前接触程序。当中before触发器相通于SQL Server中的instead of触发器,作用在检讨约束早前。而after触发器和SQL Server中千篇生机勃勃律,在自己争辩限定之后才生效。

下图为SQL Server中instead of和after触发器的干活岗位。在MySQL/MariaDB中是同等的,只要把MySQL/MariaDB中的概念和SQL Server中的概念对应起来就能够。后文中有对该图的解析。

澳门新葡萄京娱乐网站 1

在MySQL中,一张表只好有三个同不经常候间、同事件的触发器,所以MySQL中不支持基于列的触发器。比方,一张表中能够存在before insert触发器和before update,所以每张表最多只可以有6个触发器。但是MariaDB 10.2.3中得认为同不常候间、同事件创制多少个触发器。

在MySQL/MariaDB中,使用old和new表分级代表触发器激活后的新旧表,在SQL Server中央银行使的是inserted和deleted表,其实它们的含义是等价的。可是坑爹的是MySQL/MariaDB中只好引用这两张表中的列,而可望不可即直接援引这两张表。譬喻能够援用old.col_name,不过不可能直接select * from old那般援用old表。

old表表示删除目的识录之后将去除的记录封存在old表中,即deleted表。new表表示向表中插入新记录之前,新记录保存在new表中,即inserted表。或然说,只要提到了insert相关的操作就有new表,只要提到了delete相关的操作就有old表,而update操作基本得以认为是先delete再insert的一举一动,所以也会触发这两张表。

稳重,即便是after触发器,也是先将数据填充到old、new表中,再实行DML语句,最后激活触发器执行触发器中的语句。

在底下的小节中会分别证实分裂事件不一样时期的触发器行为。在验证它们此前,先成立示范数据。

CREATE DATABASE IF NOT EXISTS test ;

USE test ;

CREATE OR REPLACE TABLE emp (
    emp_no INT (11) NOT NULL,
    mgr_no INT (11) DEFAULT NULL,
    emp_name VARCHAR (30) DEFAULT NULL,
    PRIMARY KEY (emp_no)
) 
INSERT INTO emp (emp_no, mgr_no, emp_name) VALUES
    (1, NULL, 'David'),
    (2, 3, 'Mariah'),
    (3, 1, 'Tommy'),
    (4, 1, 'Jim'),
    (5, 3, 'Selina'),
    (6, 4, 'John'),
    (8, 3, 'Monty');

查阅该表数据。

澳门新葡萄京娱乐网站 2

再次创下立三个极端轻便的甄别表audit,该表前两列为自增列和注释列,后边的列构造类似emp表。

DROP TABLE IF EXISTS  audit;
CREATE TABLE audit AS SELECT * FROM emp WHERE 1=0;
ALTER TABLE audit ADD id INT AUTO_INCREMENT PRIMARY KEY FIRST;
ALTER TABLE audit ADD note CHAR(50) AFTER id;

只顾,除非表有三个P牧马人IMA昂CoraY KEY或UNIQUE索引,不然,使用上述五个语句一点意义都没有,与应用单纯的INSERT INTO相近。

2.insert触发器

insert触发器的功能是:当向表中插入数据的时候,将会激活触发器。有两类:before和after触发器,分别代表数据插入到表中以前和数量插入到表中之后激活触发器。

注意,只要向表中插入了新行,就能够激活insert触发器。插入新行的动作不独有独有insert语句,还恐怕有此外插入操作,比方load data语句、replace语句等等。

# 创建before insert触发器
DELIMITER $$
CREATE OR REPLACE TRIGGER test.trig_demo1 
    BEFORE INSERT ON test.emp FOR EACH ROW
    BEGIN
        INSERT INTO audit VALUES(null,'before insert',new.emp_no,new.mgr_no,new.emp_name);
    END$$
DELIMITER ;

# 创建after insert触发器
DELIMITER $$
CREATE OR REPLACE TRIGGER test.trig_demo2
    AFTER INSERT ON test.emp FOR EACH ROW
    BEGIN
        INSERT INTO audit VALUES(null,'after insert',new.emp_no,new.mgr_no,new.emp_name); 
    END$$
DELIMITER ;

before insert触发器的效劳是:当向表emp中insert数据时,将首先激活该触发器,该触发器首先会将待插入数据填充到new表中,再向审查批准表audit中插入风流洒脱行数据,并申明本次触发操作是"before insert"。触发器实施达成后,才初始向emp表中插入数据。

after insert触发器的效果与利益是:当向表emp中insert数据时,将先将数据填充到new表中,再插入到emp表,之后激活该触发器,该触发器会向审查批准表audit中插入黄金年代行数据,并申明此番触发操作是"after insert"。

近来向emp表中插入数据开展测量试验。

INSERT INTO emp VALUES(10,3,'longshuai');

安顿之后,查看audit表。

MariaDB [test]> select * from audit;
+----+---------------+--------+--------+-----------+
| id | note          | emp_no | mgr_no | emp_name  |
+----+---------------+--------+--------+-----------+
|  1 | before insert |     10 |      3 | longshuai |
|  2 | after insert  |     10 |      3 | longshuai |
+----+---------------+--------+--------+-----------+

能够看来,三回insert操作触发了before insert和after insert五个触发器。且无论before仍旧after insert触发器都有new表的留存。

在mariadb 10.2.3本子之后,三个表中可以为同一时候、同一事件创设七个触发器(在mysql中不许卡塔尔(قطر‎。比方:

# 创建第二个after insert触发器
DELIMITER $$
CREATE OR REPLACE TRIGGER test.trig_demo3
    AFTER INSERT ON test.emp FOR EACH ROW
    BEGIN
        INSERT INTO audit VALUES(null,'after insert2',new.emp_no,new.mgr_no,new.emp_name); 
    END$$
DELIMITER ;

show triggers;

澳门新葡萄京娱乐网站 3

这里删除新建的这么些trigger,注意删除trigger的时候是通过数据库名称来也援用trigger的,并非table名称。

drop trigger test.trig_demo3;

一、insert ignore

insert ignore会忽略数据库中早就存在的数码(依照主键可能独一索引决断卡塔尔(قطر‎,如若数据库非常的少,就插入新的数据,借使有数量的话就跳过那条数据.

3.delete触发器

delete触发器的成效是:当删除表中数据记录的时候,将会激活触发器。

有两类insert触发器:before和after触发器,分别代表表中著录被删除在此以前和表中数据被剔除之后激活触发器。

瞩目,delete触发器只在表中著录被删去的时候才会被激活。例如delete语句、replace语句。不过drop语句、truncate语句不会激活delete触发器,因为它们是DDL语句,而MySQL/MariaDB不帮助DDL触发器,它们并不曾对表中的记录实践delete操作。

# 创建before delete触发器
DELIMITER $$
CREATE OR REPLACE TRIGGER test.trig_demo3 
    BEFORE DELETE ON test.emp FOR EACH ROW 
    BEGIN
        INSERT INTO audit VALUES(NULL,'before delete',old.emp_no,old.mgr_no,old.emp_name); 
    END$$
DELIMITER ;

# 创建after delete触发器
DELIMITER $$
CREATE OR REPLACE TRIGGER test.trig_demo4
    AFTER DELETE ON test.emp FOR EACH ROW 
    BEGIN
        INSERT INTO audit VALUES(NULL,'after delete',old.emp_no,old.mgr_no,old.emp_name); 
    END$$
DELIMITER ;

那多个delete事件的触发器效能超级粗略,先将待删除的记录插入到old表中,再在剔除表中的记录以前、之后,向审查批准表audit中插入生龙活虎行'before delete'或'after delete'的稽审日志。

当今去除emp表中的黄金时代行记录举办测量试验。

delete from emp where emp_no=10;

除去emp表中数据现在,查看audit表。

MariaDB [test]> SELECT * FROM audit;
+----+---------------+--------+--------+-----------+
| id | note          | emp_no | mgr_no | emp_name  |
+----+---------------+--------+--------+-----------+
|  1 | before insert |     10 |      3 | longshuai |
|  2 | after insert  |     10 |      3 | longshuai |
|  3 | before delete |      0 |   NULL | NULL      |
|  4 | after delete  |      0 |   NULL | NULL      |
+----+---------------+--------+--------+-----------+

可知,叁次delete操作触发了before delete和after delete触发器。且删除记录前后old表都留存。

Case:

表布局如下:

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)

测量检验插入唯大器晚成键冲突的数码

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

如下,能够观察只插入了(6,'dd',5卡塔尔(英语:State of Qatar)那条,同一时间有一条warning提醒有再一次的值。

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)

再次查询表布局,开采就算只扩张了一条记下,但是AUTO_INCREMENT依然扩展了2个(18变为20)

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=20 DEFAULT CHARSET=utf8
    1 row in set (0.00 sec)

4.update触发器

update触发器的功能是:当表中数据记录被改过的时候,将会激活触发器。

有两类update触发器:before和after触发器,分别代表表中著录被修正早先和表中数据被更动之后激活触发器。

只顾,update操作能够以为是先delete再insert,由此它将填充old表和new表。

# 创建before update触发器
DELIMITER $$
CREATE OR REPLACE TRIGGER test.trig_demo5
    BEFORE UPDATE ON test.emp FOR EACH ROW 
    BEGIN
        INSERT INTO audit VALUES(NULL,'before update from new',new.emp_no,new.mgr_no,new.emp_name);
        INSERT INTO audit VALUES(NULL,'before update from old',old.emp_no,old.mgr_no,old.emp_name);
    END$$
DELIMITER ; 

# 创建after update触发器
DELIMITER $$   
CREATE OR REPLACE TRIGGER test.trig_demo6
    AFTER UPDATE ON test.emp FOR EACH ROW 
    BEGIN
        INSERT INTO audit VALUES(NULL,'after update from new',new.emp_no,new.mgr_no,new.emp_name);
        INSERT INTO audit VALUES(NULL,'after update from old',old.emp_no,old.mgr_no,old.emp_name); 
    END$$
DELIMITER ;

before update触发器的功能是:当更新emp表中的一条记下时,首先将表中该行记录插入到old表中,待更新结果插入到new表中,然后激活触发器,向考察表中写入数据,最终校订emp表中的记录。
after update触发器的成效是:当更新emp表中的一条记下时,首先将表中该行记录插入到old表中,待更新结果插入到new表中,然后更改emp表中的记录,最终激活触发器,向检查核对表中写入数据。

更新emp表中后生可畏行记录。

update emp set emp_no=7 where emp_no=8;

查看audit表。

MariaDB [test]> select * from audit;
+----+------------------------+--------+--------+-----------+
| id | note                   | emp_no | mgr_no | emp_name  |
+----+------------------------+--------+--------+-----------+
|  1 | before insert          |     10 |      3 | longshuai |
|  2 | after insert           |     10 |      3 | longshuai |
|  3 | before delete          |      0 |   NULL | NULL      |
|  4 | after delete           |      0 |   NULL | NULL      |
|  5 | before update from new |      7 |      3 | Monty     |
|  6 | before update from old |      8 |      3 | Monty     |
|  7 | after update from new  |      7 |      3 | Monty     |
|  8 | after update from old  |      8 |      3 | Monty     |
+----+------------------------+--------+--------+-----------+

能够见到,三回update操作触发了before update触发器和after update触发器,並且update操作时,new和old两张表中都有新旧数据。上边的结果中from new对应的是立异后的多少,来源于更新前填充的new表,from old对应的是翻新前的旧数据,来源于更新前填充的old表。

二、replace into

  • replace into 首先尝试插入数据到表中。 假如开掘表中已经有此行数据(遵照主键也许独一索引判别卡塔尔国则先删除此行数据,然后插入新的数码,不然,直接插入新数据。
  • 选取replace into,你必得怀有delete和insert权限

5.经过on duplicate key update解析触发器触发原理

在MySQL/MariaDB中,假若向表中插入的数目有再次冲突检验时会阻止插入。消除那么些题指标内部贰个主意就是运用on duplicate key update子句。那一个子句应用在insert字句中,但中间涉嫌到了update操作,这到底会触发哪些触发器呢?

此地先清空上边包车型客车audit表。

TRUNCATE audit;

第豆蔻年华测验下接收on duplicate key update子句插入无重复的笔录。注意,emp表的emp_no列具有主键属性,它不容许现身重复值。

INSERT INTO emp VALUES(15,5,'xiaofang') ON DUPLICATE KEY UPDATE emp_name='xiaofang';

查看audit表。

MariaDB [test]> select * from audit;
+----+---------------+--------+--------+----------+
| id | note          | emp_no | mgr_no | emp_name |
+----+---------------+--------+--------+----------+
|  1 | before insert |     15 |      5 | xiaofang |
|  2 | after insert  |     15 |      5 | xiaofang |
+----+---------------+--------+--------+----------+

可以看来,在插入未有再度冲突的行只触及了before insert和after insert触发器。未有触发update触发器。

再插入一条有重新冲突的笔录。

TRUNCATE audit;
INSERT INTO emp VALUES(3,1,'xiaofang') ON DUPLICATE KEY UPDATE emp_name='xiaofang';

查看audit表:

MariaDB [test]> select * from audit;
+----+------------------------+--------+--------+----------+
| id | note                   | emp_no | mgr_no | emp_name |
+----+------------------------+--------+--------+----------+
|  1 | before insert          |      3 |      1 | xiaofang |
|  2 | before update from new |      3 |      1 | xiaofang |
|  3 | before update from old |      3 |      1 | Tommy    |
|  4 | after update from new  |      3 |      1 | xiaofang |
|  5 | after update from old  |      3 |      1 | Tommy    |
+----+------------------------+--------+--------+----------+

能够见见,这里触发了3个触发器:before insert/before update/after update,为啥后边只接触了多少个insert触发器而那边触发了3个触发器。其实根据下边包车型大巴图很好解析。

澳门新葡萄京娱乐网站 4

insert into... on duplicate key update语句中,插入未有再次值冲突的笔录时,首先判别是否存在before insert触发器,有就接触,触发之后检查约束,开采并未有重新值冲突,然后直接触发after insert触发器。所以这种景况下只接触了before insert和after insert触发器。

而插入有重复值矛盾的笔录时,首先接触了before insert触发器,然后检查约束发掘有在重新值矛盾,所以改insert操作为update操作,update操作再一次再次回到事情的上边,先触发before update再检查约束,那时候早已不复重复值冲突,所早前面触发after update触发器。

Case:

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)

插入一条与记录id=3存在唯蓬蓬勃勃键(列c1)冲突的数额

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)

可以见到原有id=3,c1=3的笔录不见了,新扩充了一条id=4,c1=3的记录.
replace into语句实践完会重返二个数,来提醒受影响的行的数据。该数是被去除和被插入的行数的和,上边的例证中2 rows affected .

6.replace into算法验证

插入新记录时,对于再度值冲突的笔录,使用replace into言辞替代insert into是另黄金年代种方式。这种措施完结格局和on duplicate key update主意不相通。

replace into算法说明如下:

  1. 品尝插入新行。
  2. 留存双重值冲突时,从表中删除重复行。
  3. 将新行插入到表中。

也正是说,存在重复值冲突时,要是利用触发器的话,将先触发before insert,再触发delete操作,先是before delete再是after delete,最后触发after insert。

以下是表明进度和结果:首先清空audit表,再插入重复冲突的记录。

TRUNCATE audit;
REPLACE INTO emp VALUES(3,1,'gaoxiaofang');

查看audit表:

MariaDB [test]> select * from audit;
+----+---------------+--------+--------+-------------+
| id | note          | emp_no | mgr_no | emp_name    |
+----+---------------+--------+--------+-------------+
|  1 | before insert |      3 |      1 | gaoxiaofang |
|  2 | before delete |      0 |   NULL | NULL        |
|  3 | after delete  |      0 |   NULL | NULL        |
|  4 | after insert  |      3 |      1 | gaoxiaofang |
+----+---------------+--------+--------+-------------+

明显,和算法验证的结果是呼应的。

三、insert on duplicate key update

  • 要是在insert into 语句末尾钦赐了on duplicate key update,而且插入行后会招致在叁个UNIQUE索引或PENCOREIMAWranglerY KEY中现身重复值,则在现身重复值的行试行UPDATE;借使不会变成重复的标题,则插入新行,跟平日的insert into相通。
  • 使用insert into,你不得不持有insert和update权限
  • 倘诺有新记录被插入,则受影响行的值显示1;假如原来的笔录被更新,则受影响行的值显示2;如若记录被更新前后值是大器晚成致的,则受影响行数的值显示0

7.查看、删除触发器

mysql> SHOW CREATE TRIGGER trig_demo5G
*************************** 1. row ***************************
               Trigger: trig_demo5
              sql_mode: 
SQL Original Statement: CREATE DEFINER=`root`@`192.168.100.%` TRIGGER `test`.`trig_demo5` BEFORE UPDATE ON `test`.`emp`
    FOR EACH ROW BEGIN
        INSERT INTO audit VALUES(NULL,'before update from new',new.emp_no,new.mgr_no,new.emp_name);
        INSERT INTO audit VALUES(NULL,'before update from old',old.emp_no,old.mgr_no,old.emp_name);
    END
  character_set_client: utf8
  collation_connection: utf8_general_ci
    Database Collation: latin1_swedish_ci

mysql> show triggers;
mysql> show trigger like 'pattern';
mysql> show trigger where 'expression';

只是要注意,那么些like的格局是对表名进行相称的,并不是触发器名。举个例子触发器trig_demo1是基于emp表创造的,则选用like 'emp'而不可能使用like 'trig_demo1'。

在information_schema中有T奥迪Q5IGGEQashqaiS元数据表:

例如:

mysql> select * from information_schema.triggers where trigger_name='trig_demo1'G
*************************** 1. row ***************************
           TRIGGER_CATALOG: def
            TRIGGER_SCHEMA: test
              TRIGGER_NAME: trig_demo1
        EVENT_MANIPULATION: INSERT
      EVENT_OBJECT_CATALOG: def
       EVENT_OBJECT_SCHEMA: test
        EVENT_OBJECT_TABLE: emp
              ACTION_ORDER: 0
          ACTION_CONDITION: NULL
          ACTION_STATEMENT: BEGIN
        INSERT INTO audit VALUES(null,'before insert',NEW.emp_no,new.mgr_no,new.emp_name);
    END
        ACTION_ORIENTATION: ROW
             ACTION_TIMING: BEFORE
ACTION_REFERENCE_OLD_TABLE: NULL
ACTION_REFERENCE_NEW_TABLE: NULL
  ACTION_REFERENCE_OLD_ROW: OLD
  ACTION_REFERENCE_NEW_ROW: NEW
                   CREATED: NULL
                  SQL_MODE: 
                   DEFINER: root@192.168.100.%
      CHARACTER_SET_CLIENT: utf8
      COLLATION_CONNECTION: utf8_general_ci
        DATABASE_COLLATION: latin1_swedish_ci
1 row in set (0.00 sec)

剔除触发器的时候,必要接纳drop语句钦点数量库名,而不是钦点表名称。比如:

DROP TRIGGER [ IF EXISTS ] test.example_trigger;

Case:

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)

插入一条与记录id=3存在唯大器晚成键(列c1)冲突的多少

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)

可以见见,id=3的笔录产生了改动,c1=原有的c1+3,别的列未有变动。

结论:

  • 那二种形式都能幸免主键或许独一索引重复招致的插入失利难题。
  • insert ignore能忽视重复数据,只插入不重复的数额。
  • replace into和insert ... on duplicate key update,都以替换原有的再一次数据,分裂在于replace into是去除原有的行后,在插入新行,如有自增id,那么些会导致自增id的改过;insert ... on duplicate key update在遭遇重复行时,会直接更新原有的行,具体更新哪些字段怎么立异,决意于update后的口舌。

本文由澳门新葡萄京娱乐网站发布于澳门新葡萄京娱乐网站,转载请注明出处:MySQL避免插入重复记录的方法,如何随机排列数字

关键词:

上一篇:条件下思源燕体字体与,补充表明
下一篇:没有了