一、INSERT和REPLACE
INSERT和REPLACE句子的功用都是向表中刺进新的数据。这两条句子的语法类似。它们的首要区别是怎么处置重复的数据。
1. INSERT的通常用法
MySQL中的INSERT句子和规范的INSERT不太相同,在规范的SQL句子中,一次刺进一条记载的INSERT句子只要一种办法。
INSERT INTO tablename(列名…) VALUES(列值);
而在MySQL中还有别的一种办法。
INSERT INTO tablename SET column_name1 = value1, column_name2 =
value2,…;
榜首种办法将列名和列值分开了,在运用时,列名有必要和列值的数共同。如下面的句子向users表中刺进了一条记载:
INSERT INTO users(id, name, age) VALUES(123, '姚明', 25);
第二种办法答应列名和列值成对呈现和运用,如下面的句子将产生中样的作用。
INSERT INTO users SET id = 123, name = '姚明', age = 25;
若是运用了SET办法,有必要至少为一列赋值。若是某一个字段运用了省缺值(如默许或自增值),这两种办法都能够省掉这些字段。如id字段上运用了自增值,上面两条句子能够写成如下办法:
INSERT INTO users (name, age) VALUES('姚明',25);INSERT INTO uses
SET name = '姚明', age = 25;
MySQL在VALUES上也做了些改变。若是VALUES中啥都不写,那MySQL将运用表中每一列的默许值来刺进新记载。
INSERT INTO users () VALUES();
若是表名后啥都不写,就表明向表中所有的字段赋值。运用这种办法,不仅在VALUES中的值要和列数共同,并且次序不能倒置。
INSERT INTO users VALUES(123, '姚明', 25);
若是将INSERT句子写成如下办法MySQL将会报错。
INSERT INTO users VALUES('姚明',25);
2. 运用INSERT刺进多条记载
看到这个标题或许咱们会问,这有啥好说的,调用屡次INSERT句子不就能够刺进多条记载了吗!但运用这种办法要增加服务器的负荷,由于,履行每一次SQL服务器都要相同对SQL进行剖析、优化等操作。幸亏MySQL供给了另一种解决方案,即是运用一条INSERT句子来刺进多条记载。这并不是规范的SQL语法,因而只能在MySQL中运用。
INSERT INTO users(name, age) VALUES('姚明', 25), ('比尔.盖茨', 50),
('火星人', 600);
上面的INSERT
句子向users表中接连刺进了3条记载。值得注意的是,上面的INSERT句子中的VALUES后有必要每一条记载的值放到一对(…)中,中心运用","切割。假设有一个表table1
CREATE TABLE table1(n INT);
若是要向table1中刺进5条记载,下面写法是过错的:
INSERT INTO table1 (i) VALUES(1,2,3,4,5);
MySQL将会抛出下面的过错
ERROR 1136: Column count doesn't match value count at row 1
而正确的写法应该是这样:
INSERT INTO table1(i) VALUES(1),(2),(3),(4),(5);
当然,这种写法也能够省掉列名,这样每一对括号里的值的数目有必要共同,并且这个数目有必要和列数共同。如:
INSERT INTO table1 VALUES(1),(2),(3),(4),(5);
3. REPLACE句子
咱们在运用数据库时能够会常常遇到这种状况。若是一个表在一个字段上建立了仅有索引,当咱们再向这个表中运用现已存在的键值刺进一条记载,那将会抛出一个主键抵触的过错。当然,咱们能够想用新记载的值来掩盖本来的记载值。若是运用传统的做法,有必要先运用
DELETE句子删去原先的记载,然后再运用INSERT刺进新的记载。而在MySQL中为咱们供给了一种新的解决方案,这即是REPLACE句子。运用
REPLACE刺进一条记载时,若是不重复,REPLACE就和INSERT的功用相同,若是有重复记载,REPLACE就运用新记载的值来更换本来的记载值。
运用REPLACE的最大优点即是能够将DELETE和INSERT合二为一,构成一个原子操作。这样就能够不用思考在一起运用DELETE和INSERT时增加业务等杂乱操作了。
在运用REPLACE时,表中有必要有仅有索引,并且这个索引地点的字段不能答应空值,不然REPLACE就和INSERT彻底相同的。
在履行REPLACE后,体系回来了所影响的行数,若是回来1,阐明在表中并没有重复的记载,若是回来2,阐明有一条重复记载,体系主动先调用了
DELETE删去这条记载,然后再记载用INSERT来刺进这条记载。若是回来的值大于2,那阐明有多个仅有索引,有多条记载被删去和刺进。
REPLACE的语法和INSERT十分的类似,如下面的REPLACE句子是刺进或更新一条记载。
REPLACE INTO users (id,name,age) VALUES(123, '赵本山', 50);
刺进多条记载:
REPLACE INTO users(id, name, age) VALUES(123, '赵本山', 50),
(134,'Mary',15);REPLACE也能够运用SET句子REPLACE INTO users SET id = 123,
name = '赵本山', age = 50;
上面曾说到REPLACE能够影响3条以上的记载,这是由于在表中有超越一个的仅有索引。在这种状况下,REPLACE将思考每一个仅有索引,并对每一个索引对应的重复记载都删去,然后刺进这条新记载。假设有一个table1表,有3个字段a,
b, c。它们都有一个仅有索引。