为什么mysql在更新非空列时接受空数据,然后将数据转换为0。
我期待一个错误,它只是没有显示出来。如果有人尝试将非空列更新为null,我怎么能得到错误?我需要它,所以如果我收到错误,我可以回滚事务。数据库中是否需要任何配置才能执行此操作?谢谢
答案 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
它也没有显示错误,所以我认为这是一个数据库问题。