【问题标题】:Insert on MariaDb fails when ommitting non-default fields省略非默认字段时,在 MariaDb 上插入失败
【发布时间】:2017-02-16 09:26:59
【问题描述】:

表结构:

CREATE TABLE `setup_int` (
    `key` VARCHAR(50) NOT NULL,
    `val` INT(11) NOT NULL,
    PRIMARY KEY (`key`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB

如您所见,这些字段是NOT NULL-Fields,没有默认值。

我们更新到 MariaDB 10.1.21,现在出现以下问题: 以下查询失败,没有任何错误消息!

INSERT INTO `setup_int` (`key`) VALUES ('test');

原因似乎是缺少默认值。

  • 如果我向表中添加默认值,则插入成功。
  • 如果我将NOT NULL更改为NULL,则插入成功。
  • 如果我在 MariaDB 10.1.20 上执行此操作,则插入成功。
  • 如果我对两个字段都进行插入,则插入成功。

这行得通:

INSERT INTO `setup_int` (`key`,`val`) VALUES ('test',0);

问题是:我能做些什么(一些设置或其他东西)让 mariadb 10.1.21 像以前一样处理这种情况。我现在无法更改所有表,也无法降级。

主要问题是PHP执行的查询返回true虽然插入失败!

【问题讨论】:

  • 我看不出这里有什么问题。如果您设置一个表并告诉它val 不能为NULL,那么您必须在每次插入时为val 提供一个值。因此,如果您无法提供该值,请删除 NOT NULL 或添加 DEFAULT
  • @RiggsFolly 我同意,这种行为似乎是正常的和意料之中的。
  • 如果在 10.1.20 中将 val 留空,那么 10.1.20 中肯定存在错误,因此恢复意味着您可以再次升级数据库
  • 是的,我同意,但它与以前的行为不同。
  • 请显示缺少的 PHP 代码。您使用哪种 API,PDO、MySQLi、...

标签: php mysql mariadb


【解决方案1】:

看这里:https://stackoverflow.com/a/2503938/1973205

然后你可以像这样设置变量:https://mariadb.com/kb/en/mariadb/sql-mode/

作为一个纯逻辑事实,查询失败是正确的。

【讨论】:

  • 谢谢。但我认为给定行为没有模式值。因为我认为你写了对我的问题最接近的答案,所以我会接受它。似乎我现在必须更新所有表结构。无论如何,谢谢。
【解决方案2】:

基本上,您设置了一个约束,即val 的值不能是NULL,它失败了,因为您尝试设置它NULL

0NULL 不同。)

CREATE期间设置默认值:

CREATE TABLE `setup_int` (
    `key` VARCHAR(50) NOT NULL,
    `val` INT(11) NOT NULL DEFAULT 0,
    PRIMARY KEY (`key`)
)

【讨论】:

  • 是的,我知道这一点。但这不是问题所在。问题是:除了改变我的桌子的结构之外,我还能做些什么来让它工作。
猜你喜欢
  • 2013-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 2017-02-20
  • 1970-01-01
相关资源
最近更新 更多