Вставка / обновление таблицы с автоинкрементом и внешним ключом

0

У меня есть таблица как таковая:

id entity_id  first_year  last_year sessions_attended age

1   2020       1996         2008         3            34.7
2   2024       1993         2005         2            45.1
3    ...       ...          ...

id - первичный ключ с автоматическим инкрементом, а entity_id - это внешний ключ, который должен быть уникальным для таблицы.

У меня есть запрос, который вычисляет первый и последний год посещаемости, и я хочу иметь возможность обновлять эту таблицу свежими данными каждый раз, когда она запускается, только обновляя столбцы первого и последнего года:

Это моя вставка/обновление для "первого года":

    insert into my_table (entity_id, first_year)
( select contact_id, @sd:= year(start_date) 
from 
( select  contact_id, event_id, start_date from participations
    join events on participations.event_id = events.id where events.event_type_id = 7
    group by contact_id order by event_id ASC) as starter) 
    ON DUPLICATE KEY UPDATE first_year_85 = @sd;

У меня есть одно подобное, что и "в прошлом году", идентичное, за исключением целевого столбца и порядка.

Только запросы возвращают требуемые значения, но у меня возникают проблемы с запросами на вставку/обновление. Когда я запускаю их, я получаю те же значения для обоих полей (правильное значение first_year).

Что-то выделяется как причина этого?

Anecdotal Примечание. Это похоже на работу с MySQL 5.5.54, но при запуске на моем локальном MariaDB оно просто демонстрирует вышеуказанное поведение...

Обновить:

Не мой дизайн стола, чтобы диктовать. Это CRM, который позволяет настраивать пользовательские поля конечными пользователями, я заполняю данные через внешние запросы.

В таблице участия хранятся все регистрации событий для всех объектов-сущностей, но даты начала хранятся в отдельной таблице событий, следовательно, соединение.

Переменная есть, потому что ON DUPLICATE UPDATE не примет ссылку на столбец без нее.

Возраст на самом деле немного больше задействован: это возраст по дате начала следующего активного события определенного типа.

Поля "жестко" обновляются, поскольку значения в этой таблице извлекаются из отчетов и поисков в CRM, они должны присутствовать, не могут быть динамически вычислены.

Теги:
mariadb
on-duplicate-key

1 ответ

0

Поскольку у вас есть "естественный" PK (entity_id), почему есть id?

age? Вам придется менять эту колонку ежедневно или, по крайней мере, ежемесячно? Не хороший дизайн. Было бы лучше иметь константу birth_date в таблице, а затем вычислить возраст в SELECT.

"вычисляет первый и последний год посещаемости". Это означает, что у вас есть таблица, в которой перечислены все годы посещаемости (yoa)? Если это так, MAX(yoa) и MIN(yoa), вероятно, лучший способ вычислить вещи.

В запросах редко требуется @variables.

Мунк по моим комментариям; вернитесь для большего количества мыслей после того, как вы предоставите новый запрос, SHOW CREATE TABLE, EXPLAIN и некоторые примеры данных.

  • 0
    Проверьте использование VALUES(col) в части UPDATE IODKU.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню