2017-03-12 60 views
0

我想要的是,我想將sql_mode變量設置爲局部變量,而不是會話或全局變量。這樣做的原因是我想在執行查詢之後忽略sql模式變量的更改。會議和全球下面的工作很好,但這不是我想要的。全球一個是永遠保持sql模式爲空的模式。第一個會話將sql模式保留爲空,直到連接關閉。我想要的是,保持sql模式,直到只執行採石場。如何將sql模式變量設置爲mysql中的局部變量

mysql> set global sql_mode=''; 
mysql> set session sql_mode=''; 

MySQL查詢: -

SELECT tc_exe_grp_num,tcs.tc_tc_id,tcs.tcs_id 
FROM tc_exe_res tcer 
INNER JOIN tcs tcs 
ON tcs.tcs_id = tcer.tcs_tcs_id 
WHERE tcs.tc_tc_id='1' 
AND tcs.tc_tc_id='1' 
GROUP BY tc_exe_grp_num 
ORDER BY tc_exe_grp_num ; 

got the idea from this article

請幫助我。

回答

1

@@sql_mode是會話變量,不是局部變量。

可以檢索sql_mode的當前設置,並將其保存在用戶定義的變量中,然後再將sql_mode設置回原始設置。

例如:

-- save current setting of sql_mode in user defined variable 
-- change sql_mode to desired setting 
SET @SAVE_sql_mode = @@sql_mode ; 
SET @@sql_mode = 'NO_ENGINE_SUBSTITUTION' ; 

-- subsequent operations run under new setting of sql_mode 
SELECT '...'; 


-- set sql_mode back to saved setting 
SET @@sql_mode = @SAVE_sql_mode ; 
+0

非常感謝,這也是工作。 –

0

我無法找到這一個直接的答案,但有一個解決方案,

首先設置「SQL模式」的空單和採石場後執行設置「SQL模式」與以前有什麼有價值,請嘗試下面的方式,

set session sql_mode=''; 

    SELECT tc_exe_grp_num,tcs.tc_tc_id,tcs.tcs_id FROM tc_exe_res tcer INNER JOIN tcs tcs ON tcs.tcs_id = tcer.tcs_tcs_id WHERE tcs.tc_tc_id='1' AND tcs.tc_tc_id='1' group by tc_exe_grp_num ORDER BY tc_exe_grp_num ; 

    set session sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'; 
+0

你可以用'SET @@ SESSION.SQL_MODE = @@ GLOBAL.SQL_MODE;'把它放回去。從技術上講,SET @@ SQL_MODE = @@ GLOBAL.SQL_MODE;'完全一樣,但我喜歡以前的版本,因爲它對讀取代碼的下一個糟糕的吸取者是毫不含糊的,你在做什麼。 –

+2

或者,之前將當前值存儲在用戶定義的變量中,然後將其放回......'SET @_ SQL_MODE = @@ SQL_MODE;'之前和'SET @@ SQL_MODE = @_SQL_MODE;'將在工廠之後將當前值存儲在名爲'_SQL_MODE'的變量中(其中一個'@'是用戶定義變量的簽名,不需要聲明)。 –