【问题标题】:Mysql: Not getting an error when updating a NOT NULL column to nullMysql:将NOT NULL列更新为null时不会出错
【发布时间】:2017-10-06 07:20:05
【问题描述】:

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

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

【问题讨论】:

  • 是否有默认值?能否显示表格的ddl,以及正在运行的更新
  • 至少向我们展示您的迁移文件,它使用此列并向我们展示 database.php 配置数组(当然没有 db 凭据)
  • 还有一件事,你是使用自己的处理程序还是重写了原版处理程序?
  • @Moudiz 我正在尝试像$payment->payment_id = null; $payment->save() 一样更新,但它没有显示错误。更新成功,将payment_id值更新为0
  • @aaron0207 我刚刚在我的问题中添加了我的数据库结构。

标签: mysql sql database laravel exception-handling


【解决方案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="modes" 选项,或在 my.cnf(Unix 操作系统)等选项文件中使用 sql-mode="modes" ) 或 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

【讨论】:

  • 如何开启严格模式?
  • 我已经用文档中关于设置 sql 模式的引用更新了答案。
  • 谢谢。我认为这是正确的答案。我要去STRICT_TRANS_TABLES,因为我只需要在我的事务中,所以我可以回滚。
  • 最新版本的mysql怎么样?是否仍然可以将 NULL 插入 NOT NULL 列?
【解决方案2】:

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

您的问题不清楚,因为我们需要 table 的 DDL 和 update ,但正如您所说的那样,从逻辑上讲,因为 not 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

【讨论】:

  • 默认值为“无”
  • 没有“无”,因为没有默认值。请检查我的数据库结构。我在我的问题中添加了它
  • 是的,在我注意到您的编辑后,我删除了我的评论,似乎 php 中的某些内容是如何获得 0 值的?,您能告诉我们 php 代码吗?
【解决方案3】:

@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

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

【讨论】:

  • 请在您的问题中添加此内容并检查 sisve answet
猜你喜欢
  • 2019-08-23
  • 1970-01-01
  • 1970-01-01
  • 2021-09-15
  • 2010-10-15
  • 2019-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多