Мои SQL несоответствия в базе данных (количество элементов против автоматического увеличения) - PullRequest
1 голос
/ 07 мая 2020

У меня проблема с моей базой данных SQL, заполненной программой C с использованием коннектора my SQL. Соответствующая часть 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 с Скорость передачи 250 кбит. Как показывает код, с любым новым идентификатором телеграммы CAN база данных проверяет наличие соответствующей таблицы базы данных. В случае отсутствия, таблица будет создана. Из-за неизвестных изменений программного обеспечения CAN, к сожалению, невозможно предварительно выделить таблицы.

После двухмесячного периода измерений БД была заполнена разными телеграммами и наборами данных. Во-первых, все выглядит нормально, но при более внимательном рассмотрении видны некоторые несоответствия. Прилагаемое изображение 1 отображает 3 различных случая Cardinality-Auto-Increment-Issues, чтобы объяснить текущую ситуацию. Я не очень часто использую свои SQL или C -программирования, поэтому я был бы признателен за несколько хороших советов по решению этой проблемы.

Большое спасибо и всего наилучшего из Германии.

1 Ответ

0 голосов
/ 07 мая 2020

Количество элементов в индексе оценивается, а не абсолютное, поэтому нет гарантии, что количество строк, показанное в статистике индекса, будет точно совпадать с количеством строк, возвращаемым 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_increment, auto_increment_offset, innodb_autoinc_lock_mode влияют на то, насколько разреженным будет ваше пространство autoin c).

Если вам нужно 100% точный COUNT () или MAX (), вам придется использовать их, и это будет медленным на большой таблице. Количество элементов индекса и AUTO_INCREMENT= значение из SHOW CREATE TABLE можно использовать только как приблизительные.

...