Spec-Zone .ru
спецификации, руководства, описания, API

16.4.1.15. Репликация и Системные функции

Определенные функции не тиражируются хорошо при некоторых условиях:

Как обходное решение для предыдущих ограничений, когда основанная на операторе репликация в действительности, можно использовать стратегию сохранения проблематичного функционального результата в пользовательской переменной и обращении к переменной в более позднем операторе. Например, следующая единственная строка INSERT проблематично из-за ссылки на UUID() функция:

INSERT INTO t VALUES(UUID());

Чтобы работать вокруг проблемы, сделайте это вместо этого:

SET @my_uuid = UUID();INSERT INTO t VALUES(@my_uuid);

Та последовательность операторов тиражируется потому что значение @my_uuid сохранен в двоичном журнале как переменное пользователем событие до INSERT оператор и доступен для использования в INSERT.

Та же самая идея применяется к многократной строке, вставляет, но является более громоздким, чтобы использовать. Для вставки с двумя строками можно сделать это:

SET @my_uuid1 = UUID(); @my_uuid2 = UUID();INSERT INTO t VALUES(@my_uuid1),(@my_uuid2);

Однако, если число строк является большим или неизвестным, обходное решение является трудным или невыполнимым. Например, невозможно преобразовать следующий оператор в тот, в котором данная отдельная пользовательская переменная связывается с каждой строкой:

INSERT INTO t2 SELECT UUID(), * FROM t1;

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

FOUND_ROWS() и ROW_COUNT() функции не тиражируются, достоверно используя основанную на операторе репликацию. Обходное решение должно сохранить результат вызова функции в пользовательской переменной, и затем использовать это в INSERT оператор. Например, если Вы хотите сохранить результат в названной таблице mytable, Вы могли бы обычно делать так как это:

SELECT SQL_CALC_FOUND_ROWS FROM mytable LIMIT 1;INSERT INTO mytable VALUES( FOUND_ROWS() );

Однако, если Вы тиражируетесь mytable, следует использовать SELECT ... INTO, и затем сохраните переменную в таблице, как это:

SELECT SQL_CALC_FOUND_ROWS INTO @found_rows FROM mytable LIMIT 1;INSERT INTO mytable VALUES(@found_rows);

Таким образом пользовательская переменная тиражируется как часть контекста, и применяется на ведомое устройство правильно.

Эти функции автоматически тиражируются, используя построчную репликацию при использовании MIXED режим, и генерирует предупреждение в STATEMENT режим. (Ошибка #12092, Ошибка #30244)