首页数据库mysql insert,数据库insert

mysql insert,数据库insert

编程之家2026-05-181120次浏览

今天给各位分享mysql insert的知识,其中也会对数据库insert进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

mysql insert,数据库insert

mysql insert语句注意什么

1.基础的Insert语句示例

下面的语句向员工表插入一条新记录。在这个例子中,后的“values”指定要插入到表中的所有字段对应的值。

INSERT INTO employee VALUES(100,'Thomas','Sales',5000);

用SELECT语句来验证数据是否插入成功。

SELECT* FROM employee;

2.只针对选定的字段插入值

mysql insert,数据库insert

如果你只想向选定的字段插入值,你需要在INSERT语句中明确指定要插入的字段名字。下面的代码仅插入id和name列的数据

INSERT INTO employee(id,name) VALUES(200,'Jason');

以上代码中,我们未对dept和salary列指定任何值。所以,以上两个字段的值为NULL,当我们用SELECT语句检索数据时。需要注意的是,NULL不是指"NULL"字符串,SELECT语句使用"NULL"来表示这个字段的值是空的而已。

mysql> SELECT* FROM employee;+-----+--------+-------+--------+| id| name| dept| salary|+-----+--------+-------+--------+| 100| Thomas| Sales| 5000|| 200| Jason| NULL| NULL|+-----+--------+-------+--------+2 rows in set(0.00 sec)

3. INSERT SET示例

INSERT语句不仅仅可以使用"VALUE"关键字,也可以使用"SET"关键字。下面的例子与上面的例子结果一样,但是使用的是SET关键字。

mysql insert,数据库insert

mysql> INSERT INTO employee SET id=300, name='Mayla';mysql> select* from employee;+-----+--------+-------+--------+| id| name| dept| salary|+-----+--------+-------+--------+| 100| Thomas| Sales| 5000|| 200| Jason| NULL| NULL|| 300| Mayla| NULL| NULL|+-----+--------+-------+--------+

4.从另一个表中检索数据插入

下面的例子中,我们会使用INSERT... SELECT语句,这个语句可以从其他表中检索数据,并插入到目标表。下面的代码从Contractor表中检索所有数据并插入到Employee表。

INSERT INTO employee SELECT* FROM contractor;

SELECT语句中可以根据需要使用WHERE子句,用来检索需要的从Contractor表插入到Employee表的数据。

INSERT INTO employee SELECT* FROM contractor WHERE salary>= 7000;

注意:如果你使用oracle数据库,你的SQL应该这样写"INSERT INTO employee AS SELECT* FROM contractor"。需要注意在MySQL中不适用AS关键字。

5.从其他表中选择部分字段插入

当然,你也可以从其他表中选择部分字段的数据插入到你的表中。下面的例子将从contractor表中选择id,name字段的所有数据插入到employee表。

INSERT INTO employee(id,name) SELECT id,name FROM contractor;

跟前面的例子一样,可以使用WHERE子句过滤数据。

INSERT INTO employee(id,name) SELECT id,name FROM contractor WHERE salary>= 7000;

注意:如果employee表中已存在相同主键(这里的主键是id)的记录,你会得到一条错误信息。下面是一个示例错误信息,指出employee表中已经存在id为100的记录。

ERROR 1062(23000): Duplicate entry'100' for key'PRIMARY'

6.插入数据到指定分区

如果创建了分区表(分区类型为range)并希望将输入插入到指定分区,可以参考下面代码。将数据插入到分区p1中的employee表。

INSERT INTO employee PARTITION(p1) VALUES(100,'Thomas','Sales',5000);

注意:如果该分区的employee表中已包含相应的数据(这里是id=100的employee数据),你会得到如下错误信息。

ERROR 1729(HY000): Found a row not matching the given partition set

注意:分区仅在MySQL5.6及以上版本可用。

7.插入数据到多个分区

可以使用单条SQL语句将数据插入到多个分区。下面的INSERT语句将id为100的记录插入到p1分区,将id为200的记录插入到p2分区。

INSERT INTO employee PARTITION(p1, p2) VALUES(100,'Thomas','Sales',5000),(200,'Jason','Technology',5500);

注意:在上例中,如果MySQL往任意分区插入数据失败,那么整个INSERT语句将失败。当然,这同样仅能在MySQL5.6及以上版本使用。

8.在插入过程中忽略错误

在一些场景中(比如:批处理),你可能希望忽略插入过程中MySQL产生的错误信息,你可以使用INSERT IGNORE语句。比如:下面的例子会抛出错误信息,提示数据已经存在。

mysql> INSERT INTO employee VALUES(100,'Thomas','Sales',5000);ERROR 1062(23000): Duplicate entry'100' for key'PRIMARY'

要忽略上面的错误信息,可以使用INSERT IGNORE来替换INSERT语句(执行前请确保这条对应的主键已经存在)。

mysql> INSERT IGNORE INTO employee VALUES(100,'Thomas','Sales',5000);Query OK, 0 rows affected(0.00 sec)

INSERT IGNORE仅仅只是忽略错误信息,不会进行其他任何处理。

9. INSERT语句的默认值

如果MySQL运行在strict模式下,并且在我们的INSERT语句中并未指定默认值,那么MySQL将抛出错误信息。不过,如果MySQL并未启用strict模式(这个是默认启用的)时,同时INSERT语句没有为字段指定值,那么MySQL会为该字段使用字段类型的默认值。比如,bonus表的所有字段都不允许为空(not null)。

mysql> DESC bonus;+--------+---------+------+-----+---------+-------+| Field| Type| Null| Key| Default| Extra|+--------+---------+------+-----+---------+-------+| id| int(11)| NO|| NULL||| amount| int(11)| NO|| NULL||+--------+---------+------+-----+---------+-------+

我们先执行以下语句,插入一条数据(id=100)

INSERT INTO bonus(id) VALUES(100);

查看刚插入的数据,可以看到amount字段被设置为默认值0

SELECT* FROM bonus;+-----+--------+| id| amount|+-----+--------+| 100| 0|+-----+--------+

如果,SQL语句中同时不指定id和amount字段的值,那么他们都会被自动设置为默认值0。参考下面例子。

INSERT INTO bonus VALUES();mysql> select*

如何优化MySQL insert性能

1.一条SQL语句插入多条数据。

常用的插入语句如:

INSERTINTO`insert_table`(`datetime`,`uid`,`content`,`type`)VALUES('0','userid_0','content_0',0);

INSERTINTO`insert_table`(`datetime`,`uid`,`content`,`type`)VALUES('1','userid_1','content_1',1);

修改成:

INSERTINTO`insert_table`(`datetime`,`uid`,`content`,`type`)VALUES('0','userid_0','content_0',0),('1','userid_1','content_1',1);

修改后的插入操作能够提高程序的插入效率。这里第二种SQL执行效率高的主要原因有两个,一是减少SQL语句解析的操作,只需要解析一次就能进行数据的插入操作,二是SQL语句较短,可以减少网络传输的IO。

这里提供一些测试对比数据,分别是进行单条数据的导入与转化成一条SQL语句进行导入,分别测试1百、1千、1万条数据记录。

性能测试:这里提供了同时使用上面两种方法进行INSERT效率优化的测试。即多条数据合并为同一个SQL,并且在事务中进行插入。

2.在事务中进行插入处理。把插入修改成:

STARTTRANSACTION;

INSERTINTO`insert_table`(`datetime`,`uid`,`content`,`type`)VALUES('0','userid_0','content_0',0);

INSERTINTO`insert_table`(`datetime`,`uid`,`content`,`type`)VALUES('1','userid_1','content_1',1);

...

COMMIT;

使用事务可以提高数据的插入效率,这是因为进行一个INSERT操作时,MySQL内部会建立一个事务,在事务内进行真正插入处理。通过使用事务可以减少创建事务的消耗,所有插入都在执行后才进行提交操作。

这里也提供了测试对比,分别是不使用事务与使用事务在记录数为1百、1千、1万的情况。

从测试结果可以看到,insert的效率大概有50倍的提高,这个一个很客观的数字。

mysql 自增插入

列的自增属性,一般用来设置整数列根据一定步长逐步增长的值,类似于其他数据库的序列。不过这里的“序列”是基于特定一张表的。关于自增属性的相关特性如下:

1.控制自增属性性能的变量:innodb_autoinc_lock_mode

innodb_autoinc_lock_mode=0

代表传统模式,也就是说,在对有自增属性的字段插入记录时,会持续持有一个表级别的自增锁,直到语句执行结束为止。比如说下面两条语句,SQL 1在执行期间,一直持有对表 f1的表级自增锁,接下来 SQL 2执行时锁超时。

innodb_autoinc_lock_mode=1

代表连续模式,和传统模式差不多,不同的点在于对于简单的插入语句,比如 SQL 2,只在分配新的 ID过程中持有一个轻量级的互斥锁(线程级别,而不是事务级别),而不是直到语句结束才释放的表锁。

代表交错模式。这个模式下放弃了自增表锁,产生的值会不连续。不过这是性能最高的模式,多条插入语句可以并发执行。MySQL 8.0默认就是交错模式。

那针对复制安全来说,以上三种模式,0和 1对语句级别安全,也就是产生的二进制日志复制到任何其他机器都数据都一致;2对于语句级别不安全;三种模式对二进制日志格式为行的都安全。

2.控制自增属性的步长以及偏移量

一般用在主主复制架构或者多源复制架构里,主动规避主键冲突。

auto_increment_increment控制步长

auto_increment_offset控制偏移量

3.对于要立刻获取插入值的需求

就是说要获取一张表任何时候的最大值,应该时刻执行以下 SQL 3,而不是 SQL 2。SQL 2里的函数 last_insert_id()只获取上一条语句最开始的 ID,只适合简单的 INSERT。

4.自增列溢出现象

自增属性的列如果到了此列数据类型的最大值,会发生值溢出。比如变更表 f1的自增属性列为 tinyint。

SQL 2显式插入最大值 127, SQL 3就报错了。所以这点上建议提前规划好自增列的字段类型,提前了解上限值。

5.自增列也可以显式插入有符号的值

那针对这样的,建议在请求到达数据库前规避掉。

关于本次mysql insert和数据库insert的问题分享到这里就结束了,如果解决了您的问题,我们非常高兴。

javascript版本?js版本是什么意思免费企业建站,免费建站网站