当社のデータベースには、注文番号を生成する機能があります。設定テーブルから値を読み取り、インクリメントしてから、新しい値を返します。例えば:
CREATE FUNCTION NextOrderNumber() RETURNS INTEGER UNSIGNED NOT DETERMINISTIC
BEGIN
DECLARE number INTEGER UNSIGNED;
UPDATE Settings SET IntegerValue=LAST_INSERT_ID(IntegerValue+1) WHERE KeyName='NextOrderNumber';
SET number=LAST_INSERT_ID();
return number;
END
注: この関数を批判しないでください。説明のためだけに欠陥があることはわかっています。
この関数を次のように使用します。
INSERT INTO Orders(OrderNumber, ...)
SELECT NextOrderNumber(), ...
バイナリ ログが有効になっている場合、CREATE FUNCTION で次のエラーが発生します。
この関数の宣言には、DETERMINISTIC、NO SQL、または READS SQL DATA が含まれておらず、バイナリ ログが有効になっています (安全性の低い log_bin_trust_function_creators 変数を使用することをお勧めします)。
binlog_format がどのように設定されているかに関係なく、上記の機能に本当に問題がありますか? 関連するMySQL ページを読んだところによると、この関数が ROW または STATEMENT レベルのバイナリ ロギングのレプリケーションと互換性がない理由がわかりません。
関数が安全な場合、グローバル log_bin_trust_function_creators=1 を設定すると不安になります。このチェックをすべての機能で無効にするのではなく、この機能だけを無効にします。代わりに、警告を抑制するために関数に NO SQL のフラグを立てることはできますか? 私はそれを試してみましたが、うまくいきました。これは何か問題を引き起こしますか?