mysql server 版本:8.0.31


Q: 对于 mysql 协定,insert 的返回值外面蕴含什么信息?是否蕴含 insert_id?

A: 通过 wireshark 抓包,后果如下:

执行 sql:

INSERT IGNORE INTO `user` (`name`, `age`) VALUES ('1', 25), ('2', 25), ('2', 25);

mysql server 返回的内容如下:

Q:mysql 一次插入多行数据,获取的 insert_id 是第一行的 id 还是最初一行的 id?

A: 从上图可知,是第一个!mysql 的开发人员真是一群笨蛋!


测试代码如下:

from loguru import loggerfrom peewee import *import settingsfrom playhouse.shortcuts import ReconnectMixinfrom pymysql.cursors import Cursorhost = settings.MYSQL_CONFIG.hostport = settings.MYSQL_CONFIG.portusername = settings.MYSQL_CONFIG.usernamepassword = settings.MYSQL_CONFIG.passworddatabase_name = settings.MYSQL_CONFIG.database_nameclass ReconnectMySQLDatabase(ReconnectMixin, MySQLDatabase):    passdb = ReconnectMySQLDatabase(    database=database_name,    host=host,    port=port,    user=username,    password=password,    charset='utf8mb4')class User(Model):    name = CharField(unique=True)    age = IntegerField()    created_at = DateTimeField(        null=False,        constraints=[SQL('DEFAULT CURRENT_TIMESTAMP')],        help_text='应用数据库工夫'    )    updated_at = DateTimeField(        null=False,        constraints=[            SQL('DEFAULT CURRENT_TIMESTAMP'),            SQL('ON UPDATE CURRENT_TIMESTAMP'),        ]    )    class Meta:        database = db        table_name = 'user'model_set = [User]db.drop_tables(model_set)db.create_tables(model_set)with db.cursor() as cursor:    cursor: Cursor    sql = """    INSERT IGNORE INTO `user` (`name`, `age`) VALUES ('1', 25), ('2', 25), ('2', 25);    """.strip()    print('affected_rows: ', cursor.execute(sql))    print('lastrowid: ',cursor.lastrowid)    cursor.connection.commit()  # 这里必须要提交,不然所有的查问都会处于一个事务中