2016-12-29 3 views
0

У меня есть доступ к набору данных отчетности (который я не контролирую), который мы ежедневно получаем из облачной службы и храним в mysql db, чтобы запускать расширенную отчетность и сообщать о сбое локально с сторонним программным обеспечением для визуализации данных.Как добавить значение автоматического увеличения в двойное значение?

Данные часто имеют повторяющиеся значения в поле id, которые создают проблемы при объединении с другими таблицами для анализа данных.

Например:

+-------------+----------+------------+----------+ 
| workfile_id | zip_code | date | total | 
+-------------+----------+------------+----------+ 
|  78002 | 90210 | 2016-11-11 | 2010.023 | 
|  78002 | 90210 | 2016-12-22 | 427.132 | 
+-------------+----------+------------+----------+ 

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

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

  1. Сделать дубликат workfile_id уникальной , Пусть sql добавляет число в идентификатор рабочего файла, когда найден дубликат. Первый дубликат (или второе вхождение одного и того же идентификатора файла) должен получить .01, добавленный к концу идентификатора рабочего файла. Затем, если будет вставлен другой дубликат, ему нужно будет автоматически увеличивать добавленное число, например .02 и т. Д. С любым последующим дублирующим workfile_id. Этот метод будет работать лучше всего с нашими данными, но мне любопытно, как это было бы сложно для сервера с точки зрения производительности. Если бы я мог запланировать изменение, которое должно произойти после того, как данные были вставлены, чтобы ускорить ввод исходных данных, это было бы идеально.
  2. Суммировать полные столбцы и удалять повторяющиеся строки workfile_id. Задайте задачу, которая идентифицирует повторяющиеся файлы workfile_id и суммирует финансовые столбцы дубликатов, заменяя исходную сумму на новую сумму и удаляя «новую строку» после того, как столбцы были добавлены вместе. Это более беспорядочно с точки зрения сохранения данных, но приемлемо, если первое решение невозможно.

Мое предположение, что будет значительные издержки, чтобы сервер сравнить новые значения workfile_id для всех существующих значений worlfile_id вставляется каждый раз, когда данные, но наш набор данных невелик и новые данные только вставляются один раз в день, на 1 : 30am, и также должно быть возможно сохранить дубликат workfile_id для поиска строк, вставленных в течение последних 6 месяцев.

Является находки дублирует в колонке (workfile_id) и добавление автоинкрементного значения на workfile_id возможной?

EDIT: У меня возникли проблемы с запуском моего триггера, основанного на ответе sdsc81 ниже. Любые идеи?

DELIMITER // 

CREATE TRIGGER append_subID_to_workfile_ID_salesjournal 
AFTER INSERT 
    ON salesjournal FOR EACH ROW 

BEGIN 
    SET @COUNTER = (SELECT (COUNT(*)-1) FROM salesjournal WHERE workfile_id = NEW.workfile_id); 
    IF @COUNTER > 1 THEN 
     UPDATE salesjournal SET workfile_id = CONCAT(workfile_id, @COUNTER) WHERE id = NEW.id; 
    END IF; 

END;// 

DELIMITER ; 

Это трудно понять, если триггер не работает вообще, или если только код в триггер не работает. У меня нет ошибок при вставке. Есть ли способ отлаживать ошибки запуска?

ответ

0

Ну, все Возможное;)

Вы не контролировать набор данных, но вы можете modifify базу данных, не так ли? Затем вы можете использовать триггер после каждой вставки нового значения и обновить его, если его дубликат. Что-то вроде:

SET @COUNTER = (SELECT (COUNT(*)-1) FROM *your_table* WHERE workfile_id = NEW.workfile_id); 
IF @COUNTER > 1 THEN 
    UPDATE *your_table* SET workfile_id = CONCAT(workfile_id, @COUNTER) WHERE some_unique_id = NEW.some_unique_id; 
END IF; 

Если есть только одна вставка в день, и определен индекс по значению workfile_id, то оно не должно быть никаких проблем для вашего сервера на всех.

Кроме того, вы можете реализовать второе решение, выполнив:

DELIMITER // 

CREATE TRIGGER append_subID_to_workfile_ID_salesjournal 
AFTER INSERT ON salesjournal FOR EACH ROW 

BEGIN 
SET @COUNTER = (SELECT (COUNT(*)-1) FROM salesjournal WHERE workfile_id = NEW.workfile_id); 
IF @COUNTER > 1 THEN 
    UPDATE salesjournal SET total = total + NEW.total WHERE workfile_id = NEW.workfile_id AND id <> NEW.id; 
    DELETE FROM salesjournal WHERE id = NEW.id; 
END IF; 

END;// 

DELIMITER ; 

Надеется, что это помогает.

+0

Если вам нужно, чтобы значение добавлялось в 2 цифры, вы можете использовать что-то вроде 'SET @COUNTER = CONCAT ('0', @COUNTER);' и затем 'SET @COUNTER = SUBSTR (@COUNTER, LENGTH (@COUNTER - 1)); 'перед инструкцией' UPDATE your_table ... '. Это грязно, но нужно делать трюк. Приветствия – sdsc81

+0

Да, извините, если я не понял. Я полностью контролирую базу данных назначения. Я не администратор db по торговле, поэтому я не понял, как это будет сделано. Сегодня я болотистый, но я буду проверять ваш метод как можно скорее и выбрать его правильно, если он будет работать. Спасибо за быстрый ответ. – tephlon

+0

Привет! Я дважды проверял и вижу, что я исправил запрос. Кстати, это все ваши поля в таблице? или у вас есть unike * id *, который идентифицирует каждую строку? (Я имею в виду, как значение автоинкремента). Потому что это необходимо для правильной работы. Дай мне знать. – sdsc81

Смежные вопросы