【问题标题】:My SQL Database inconsistencies (Cardinality vs. Auto Increment)Mysql 数据库不一致(基数与自动增量)
【发布时间】:2020-08-22 14:52:02
【问题描述】:

我的 SQL 数据库由使用我的 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 字节十六进制值,由具有 250kbit 波特率的峰值 CAN 接口创建。如代码所示,DB 使用任何新的 CAN 报文 ID 验证对应的 DB 表的存在。如果不存在,则将创建该表。不幸的是,由于 CAN 软件的未知更改,无法预先分配表格。

经过两个月的测量期后,数据库得到了不同的电报和数据集。首先,一切看起来都很好,但仔细观察,就会发现一些不一致之处。附图1展示了3种不同的Cardinality-Auto-Increment-Issues案例来解释当前的情况。因此,我的 SQL 或 C 编程并不常见,我希望能得到一些好的建议来解决这个问题。

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

【问题讨论】:

    标签: mysql c database auto-increment cardinality


    【解决方案1】:

    索引上的基数是估计的而不是绝对的,因此不能保证索引统计信息中显示的基数与SELECT COUNT(*) FROM table_name;返回的行数完全匹配它应该接近,但没有保证它是平等的。

    也不能保证下一个 auto_increment 值等于SELECT MAX(auto_increment_field)+1。唯一的保证是它将大于或等于SELECT MAX(auto_increment_field)+1。可以分配但不使用 auto_increment 值,例如你做这样的事情:

    START TRANSACTION;
        INSERT INTO table_name VALUES(...);
    ROLLBACK;
    

    这将增加下一个 auto_increment 值,但不会产生具有分配的 auto_increment 值的行。可能会跳过值还有其他原因(例如,auto_increment_incrementauto_increment_offsetinnodb_autoinc_lock_mode 设置都会影响您的 autoinc 空间的稀疏程度)。

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

    【讨论】:

    • Hallo Gordan,非常感谢您的快速回复。我猜你不认为描述的问题是一个问题。你会说这就是phpmyadmin-interface无法正确显示输出的原因吗(如图Case 2所示)?
    • 我不确定,我不使用 phpmyadmin 做任何事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-20
    • 1970-01-01
    • 2015-07-05
    • 1970-01-01
    相关资源
    最近更新 更多