2017-10-06 102 views
1

時沒有收到錯誤消息爲什麼在更新時NOT NULL列,然後將數據轉換爲0。MySQL的:更新NOT NULL列設置爲空

我期待它只是沒有錯誤的MySQL接受空數據出現。如果有人試圖將非空列更新爲空,我怎麼能得到一個錯誤?我需要它,所以我可以回滾事務,如果我得到一個錯誤。是否有任何配置需要在數據庫內做到這一點?謝謝

enter image description here

+0

是否有默認值?你能顯示錶的ddl和你正在運行的更新嗎? – Moudiz

+0

向我們展示你的遷移文件,至少是哪個使用這個列,並告訴我們database.php配置數組(當然沒有數據庫憑證) – aaron0207

+0

還有一件事,你是使用自己的處理程序還是重寫了香草處理程序? – aaron0207

回答

1

您尚未指定您正在使用的是哪個版本的Mysql,以及處於哪種模式。我會回答這個假設你正在運行Mysql 5.7 而不是嚴格模式。

嚴格模式控制MySQL如何處理數據更改語句(如INSERT或UPDATE)中的無效值或缺失值。由於多種原因,值可能無效。例如,它可能具有該列的錯誤數據類型,或者它可能超出範圍。當要插入的新行不包含非NULL列的值時,缺少其定義中沒有顯式DEFAULT子句的值。 (對於NULL列,如果值缺失,則插入NULL。)嚴格模式也影響DDL語句,例如CREATE TABLE。

如果嚴格模式不生效,MySQL會爲無效值或缺失值插入調整值並生成警告(請參見第13.7.5.40節「SHOW WARNINGS Syntax」)。在嚴格模式下,您可以使用INSERT IGNORE或UPDATE IGNORE來產生此行爲。

來源:https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sql-mode-full

我建議您啓用嚴格模式(STRICT_ALL_TABLES)和修復您的應用程序來支持它;這也將強制執行其他查詢限制,其中人們通常被ONLY_FULL_GROUP_BY擊中。

要在服務器啓動時設置SQL模式,請在命令行上使用--sql-mode =「modes」選項,或在選項文件(如my.cnf)中使用sql-mode =「modes」 Unix操作系統)或my.ini(Windows)。模式是用逗號分隔的不同模式的列表。要明確清除SQL模式,請在命令行中使用--sql-mode =「」或選項文件中的sql-mode =「」將其設置爲空字符串。

要改變SQL模式在運行時,使用SET語句設置全局或會話的sql_mode系統變量:

SET GLOBAL sql_mode = 'modes'; 
SET SESSION sql_mode = 'modes'; 

來源:https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sql-mode-setting

+0

如何啓用嚴格模式? – JaneTho

+0

我已經用關於設置sql模式的文檔的引用更新了答案。 – sisve

+0

謝謝。我認爲這是正確的答案。我會用'STRICT_TRANS_TABLES'來做,因爲我只需要在我的事務中,所以我可以回滾。 – JaneTho

0

爲什麼更新NOT NULL列和 然後將數據轉換爲0

您的問題什麼時候MySQL的接受空數據並不清楚,因爲我們需要的DDL的表和更新,但從你所說的,從邏輯上說,因爲列不爲null具有默認值0.請檢查下面的示例。

create table Test_table (name varchar(100) null , position_s varchar(100) default 'Y' not null) 
SQL>  
Table created 
insert into Emp_table (name) values('Me') 
SQL>  
1 row inserted 
SQL> 




NAME                    POSITION_S 
-------------------------------------------------------------------------------- -------------------------------------------------------------------------------- 
Me                    Y 
+0

默認值是'無' – JaneTho

+0

沒有'沒有',因爲在沒有默認值。請檢查我的數據庫結構。我在我的問題中添加了它 – JaneTho

+0

是的,我刪除了我的評論後,我發現你的編輯,它似乎在PHP如何獲得0值的東西?,你可以告訴我們的PHP代碼? – Moudiz

0

@ aaron0207 @Moudiz我使用laravel和像這樣更新數據。

$specificReservation = Reservation::where('reference_id',$reference_id)->first(); 
$specificReservation->res_status = 1; 
$specificReservation->payment_id = null; 
$specificReservation->save(); 

我也試圖與該

UPDATE reservations SET payment_id = null 

手動更新數據庫,它也沒有顯示出錯誤,所以我認爲這是一個數據庫的問題。

+0

請在你的問題中加上這個,並檢查sisve answet – Moudiz