Mysql:将NOT NULL列更新为null时没有出错

时间:2017-10-06 07:20:06

标签: mysql sql database laravel exception-handling

为什么mysql在更新非空列时接受空数据,然后将数据转换为0。

我期待一个错误,它只是没有显示出来。如果有人尝试将非空列更新为null,我怎么能得到错误?我需要它,所以如果我收到错误,我可以回滚事务。数据库中是否需要任何配置才能执行此操作?谢谢

enter image description here

3 个答案:

答案 0 :(得分:1)

您尚未指定您正在使用的Mysql版本以及使用的模式。假设您在没有严格模式的情况下运行Mysql 5.7 ,我会回答这个问题。

  

严格模式控制MySQL如何处理数据更改语句(如INSERT或UPDATE)中的无效或缺失值。由于多种原因,值可能无效。例如,列可能具有错误的数据类型,或者可能超出范围。当要插入的新行不包含其定义中没有显式DEFAULT子句的非NULL列的值时,缺少值。 (对于NULL列,如果缺少值,则插入NULL。)严格模式也会影响DDL语句,例如CREATE TABLE。

     

如果严格模式没有生效,MySQL会为无效或缺失值插入调整后的值并产生警告(参见第13.7.5.40节“显示警告语法”)。在严格模式下,您可以使用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 ="模式"命令行上的选项,或sql-mode ="模式"在一个选项文件中,例如my.cnf(Unix操作系统)或my.ini(Windows)。 modes是由逗号分隔的不同模式的列表。要显式清除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

答案 1 :(得分:0)

  

为什么mysql在更新非空列时接受空数据   然后将数据转换为0。

您的问题不明确,因为我们需要表格的DDL和更新,但是从您所说的内容来看,逻辑上是正确的,因为列非空值具有默认值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

答案 2 :(得分: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

它也没有显示错误,所以我认为这是一个数据库问题。