Skip to content

wish table_data

do- edited this page Jan 22, 2018 · 1 revision

Описание

Была предназначена для внесения множества записей в одну из таблиц БД, в том числе если простой INSERT может вызвать коллизии с имеющимся содержимым.

Процедура wish предназначена не только для работы с данными таблиц БД. Она реализует общий алгоритм:

  • узнать текущее состояние;
  • сопоставить в предъявленными требованиями;
  • вычислить и применить минимальные обновления.
Эта логика в основном применяется по ходу обновления схемы БД на старте приложения (аналог CREATE OR REPLACE для таблиц, их полей и индексов). А по ходу работы, в прикладном коде, практически может понадобиться только правка данных.

Тем не менее, в настоящее время для этих же целей рекомендуется по возможности использовать пакетный вариант sql_do_upsert.

Данные с общей частью

Рассмотрим редактирование многозначных данных, таких, как установление связей многие-ко-многим или показателей, вводимых в статистические формы.

В этой ситуации, как правило, имеется таблица table с минимум 2 ссылками:

  • на текущую форму (id_form) и
  • на некоторый справочник (id_voc).
Типичная задача: добиться того, чтобы для текущей формы с id_form = $_REQUEST {id} (это — общая часть данных всех записей на отображаемой форме) и каждого непустого $_REQUEST {_id_voc_$id_voc} в ней имелось по 1 записи с fake = 0. Задача эта решается вызовом
 	wish (table_data => 	
 		[map {{	fake => 0, id_voc => $_ }} get_ids ('id_voc')], {		
 			table   => 'table',
 			root    => {id_form => $_REQUEST {id}},
 			key     => 'id_voc', 			
 		} 		
 	);

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

Приведённый пример является распространённым, но несколько вырожденным: здесь строка id_voc одновременно является значением 3 независимых параметров. В более сложных случаях (когда надо учитывать не только факт непустоты, но и значение параметра) комбинацию map / get_ids необходимо заменить на формирование целевого списка вручную.

Данные с явными id

Если опция root не задана, множество записей, с которыми происходит сопоставление, расширяется до всей таблицы. При этом порядок исполнения желаний имеет специфику:

  • id должны быть явно указаны в описании данных;
  • сборка мусора не производится.
Такой режим работы соотвествует расширяемому справочнику, в котором есть несколько строк с заранее известными номерами. Именно так обрабатывается раздел data в описании схемы данных.

Clone this wiki locally