2017-10-06 101 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