ERROR 1418 (HY000): 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)
錯誤的原因:
Mysql配置了復制,復制功能也就意味着Master數據的變化,會同步到Slave。對於函數,Mysql要求函數不能修改數據。
解決辦法:
1、創建函數的時候,明確說明我不會修改數據。創建函數的時候有5個選項:
a、DETERMINISTIC 確定性的
b、NO SQL 沒有包含SQl語句,當然也不會修改數據
c、READS SQL DATA 只是讀取數據,當然也不會修改數據
d、MODIFIES SQL DATA 要修改數據
e、CONTAINS SQL 包含了SQL語句
怎么理解DETERMINISTIC確定性的?
可以認為輸入相同,方法執行過程,輸出也是相同的。也就是方法的可重入性。不可重入的方法:方法內使用了靜態的數據,使用了malloc和free,使用了標准I/O函數。
創建函數必須明確指出a、b、c三個選項中的一個,才能執行成功。如下:
mysql> show variables like 'log_bin%';
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| log_bin | ON |
| log_bin_trust_function_creators | OFF |
| log_bin_trust_routine_creators | OFF |
+---------------------------------+-------+
3 rows in set
mysql> create function fun1 (num int(9)) returns int(9)
begin
return 1;
end;
1418 - 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)
mysql> create function fun1 (num int(9)) returns int(9) reads sql data
begin
return 1;
end;
Query OK, 0 rows affected
mysql> drop function fun1;
Query OK, 0 rows affected
mysql> create function fun1 (num int(9)) returns int(9) deterministic
begin
return 1;
end;
Query OK, 0 rows affected
2、告訴Mysql,信任我,方法不會修改數據,Mysql不再檢查,即使修改了數據。這個時候要靠你信守承諾,否則后果自負。
mysql> drop function fun1;
Query OK, 0 rows affected
mysql> set global log_bin_trust_function_creators=on;
Query OK, 0 rows affected
mysql> show variables like 'log_bin%';
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| log_bin | ON |
| log_bin_trust_function_creators | ON |
| log_bin_trust_routine_creators | ON |
+---------------------------------+-------+
3 rows in set
mysql> create function fun1 (num int(9)) returns int(9) modifies sql data
begin
return 1;
end;
Query OK, 0 rows affected