Mysql 我的SQL数据库不一致(基数与自动增量)

Mysql 我的SQL数据库不一致(基数与自动增量),mysql,c,database,auto-increment,cardinality,Mysql,C,Database,Auto Increment,Cardinality,我的SQL数据库由使用my SQL连接器的C程序填充时出现问题。填充数据库的C代码对应部分如下所示: sprintf(query_table, "CREATE TABLE IF NOT EXISTS `%08X` (COUNTER INT NOT NULL AUTO_INCREMENT PRIMARY KEY, TIME TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP(6), DATA VARCHAR(16))", frame.can_id-0x80000000);

我的SQL数据库由使用my SQL连接器的C程序填充时出现问题。填充数据库的C代码对应部分如下所示:

sprintf(query_table, "CREATE TABLE IF NOT EXISTS `%08X` (COUNTER INT NOT NULL AUTO_INCREMENT PRIMARY KEY, TIME TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP(6), DATA VARCHAR(16))", frame.can_id-0x80000000);

    if (mysql_query(conn, query_table) != 0)               
        {                                                                                                  
        fprintf(stderr, "Query Failure; create tables from can log!\n");                                                              
        return EXIT_FAILURE;                                                                             
        }              

sprintf(query, "INSERT INTO `%08X` (TIME, DATA) VALUES (FROM_UNIXTIME(%ld.%06ld), '%02X%02X%02X%02X%02X%02X%02X%02X')",frame.can_id-0x80000000,tv.tv_sec,tv.tv_usec,frame.data[0],frame.data[1],frame.data[2],frame.data[3],frame.data[4],frame.data[5],frame.data[6],frame.data[7]);
//printf("%s",query);

    if (mysql_query(conn, query) != 0)                                                                             
        {                                                                                                  
        fprintf(stderr, "Query Failure; insert into database!\n");                                                              
        return EXIT_FAILURE;                                                                             
        }
frame.data是一个子结构,包括字节8字节十六进制值,由峰值CAN接口以250kbit波特率创建。如代码所示,DB使用任何新的CAN电报ID验证是否存在相应的DB表。如果不存在,将创建表。不幸的是,由于CAN软件的未知更改,无法预先分配表

在两个月的测量期后,使用不同的电报和数据集完成DB。首先,一切看起来都很好,但仔细观察,可以发现一些不一致之处。所附图片显示了3个基数自动递增问题的不同案例,以解释当前情况。我对我的SQL或C语言编程不是很熟悉,因此,如果能得到一些好的建议来解决这个问题,我将不胜感激


非常感谢您,祝您在德国一切顺利。

索引的基数是估计的,而不是绝对的,因此不能保证索引统计数据中显示的基数与表\u name中的
SELECT COUNT(*)返回的行数完全匹配应该接近,但不能保证相等

也不能保证下一个自动增量值等于
SELECT MAX(自动增量字段)+1
。唯一的保证是它将大于或等于
SELECT MAX(自动增量字段)+1
。可以分配但不使用自动增量值,例如,您可以执行以下操作:

START TRANSACTION;
    INSERT INTO table_name VALUES(...);
ROLLBACK;
这将增加下一个自动增量值,但不会产生具有分配的自动增量值的行。跳过值还有其他原因(例如,
auto\u increment\u increment
auto\u increment\u offset
innodb\u autoinc\u lock\u mode
设置都会影响autoinc空间的稀疏程度)


如果您需要100%准确的COUNT()或MAX(),则必须使用它们,而且在大桌子上的速度会很慢。索引基数和
SHOW CREATE TABLE
中的
AUTO\u INCREMENT=
值只能用作近似值。

索引的基数是估计的,而不是绝对的,因此不能保证索引统计信息中显示的基数与
SELECT COUNT(*)返回的行数完全匹配从表_名称应该接近,但不能保证相等

也不能保证下一个自动增量值等于
SELECT MAX(自动增量字段)+1
。唯一的保证是它将大于或等于
SELECT MAX(自动增量字段)+1
。可以分配但不使用自动增量值,例如,您可以执行以下操作:

START TRANSACTION;
    INSERT INTO table_name VALUES(...);
ROLLBACK;
这将增加下一个自动增量值,但不会产生具有分配的自动增量值的行。跳过值还有其他原因(例如,
auto\u increment\u increment
auto\u increment\u offset
innodb\u autoinc\u lock\u mode
设置都会影响autoinc空间的稀疏程度)


如果您需要100%准确的COUNT()或MAX(),则必须使用它们,而且在大桌子上的速度会很慢。索引基数和
AUTO_INCREMENT=
SHOW CREATE TABLE
中的值只能用作近似值。

Hallo Gordan,非常感谢您的快速回复。我猜你不认为所描述的问题是个问题。您是否会说这就是为什么phpmyadmin接口在以reight方式显示输出时出现一些问题的原因(如图片案例2所示)?我不确定,我什么都不使用phpmyadmin。哈罗·戈尔丹,非常感谢您的快速回复。我猜你不认为所描述的问题是个问题。您是否认为这就是phpmyadmin接口在以reight方式显示输出时出现问题的原因(如图片案例2所示)?我不确定,我不使用phpmyadmin做任何事情。