我們的數據庫具有生成訂單號的功能。它從Settings表中讀取一個值,然後遞增它,然後返回新的值。例如:CREATE FUNCTION錯誤「此函數沒有DETERMINISTIC,NO SQL或READS SQL DATA」
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給出了這樣的錯誤:
This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you might want to use the less safe log_bin_trust_function_creators variable)
無論設定什麼binlog_format的,是真的有問題以上功能?根據我的相關MySQL page的閱讀,我看不出任何原因,爲什麼此功能將與複製不兼容,無論是ROW或STATEMENT級二進制日誌記錄。
如果函數是安全的,那麼設置全局log_bin_trust_function_creators = 1會讓我感到不安。我不想禁用所有功能的檢查,只是這一個。我是否可以將該函數標記爲NO SQL來禁止警告?我試過了,它工作。這會導致任何問題嗎?
symcbean - 我知道這種方法在羣集中不起作用。我不是在問那種情況。我在詢問簡單的主從設置,插入/更新只發生在一個地方。 – richb 2011-02-07 23:11:58