INSERT 不适用于 NOT NULL 但 UPDATE 可以,为什么?

Rey*_*rPM 2 mariadb null insert update

我有这个表定义:

CREATE TABLE `media` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `brands_id` int(11) DEFAULT NULL,
  `media_type` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
  `title` varchar(45) COLLATE utf8_unicode_ci NOT NULL,
  `description` longtext COLLATE utf8_unicode_ci NOT NULL,
  `thumbnail_url` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `media_url` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `media_code` varchar(45) COLLATE utf8_unicode_ci NOT NULL,
  `inactive` tinyint(1) NOT NULL,
  `createdAt` datetime NOT NULL,
  `updatedAt` datetime NOT NULL,
  `titleHtml` varchar(45) COLLATE utf8_unicode_ci NOT NULL,
  `descriptionHtml` longtext COLLATE utf8_unicode_ci NOT NULL,
  `useHtml` tinyint(1) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `UNIQ_6A2CA10CBF396750` (`id`),
  KEY `IDX_6A2CA10CE9EEC0C7` (`brands_id`),
  CONSTRAINT `FK_6A2CA10CE9EEC0C7` FOREIGN KEY (`brands_id`) REFERENCES `brands` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ROW_FORMAT=COMPACT;
Run Code Online (Sandbox Code Playgroud)

每次我尝试插入新记录时,由于NOT NULL约束,我都会收到一个错误,没关系,现在如果我尝试更新同一条记录并且我将title和/description或任何其他必填字段留空,则执行 UPDATE 并且该列是设置为空白,为什么?我怎样才能避免这种情况?我正在使用 MariaDB 5.5.46。

更新

根据主持人的要求,下面是我尝试过的 INSERT 和 UPDATE 查询:

INSERT INTO media (media_type, title, titleHtml, description, descriptionHtml, thumbnail_url, media_url, media_code, inactive, useHtml, createdAt, updatedAt, brands_id) VALUES (null,"Media Title Test",null,null,null,"https://someurl",null,null,false,false,"2015-10-22 22:07:54","2015-10-22 22:07:54",null)
Run Code Online (Sandbox Code Playgroud)

上面的 INSERT 失败,因为数据库中的 CONSTRAINTS

UPDATE media SET description = null, updatedAt = "2015-10-22 22:12:18" WHERE id = 13
Run Code Online (Sandbox Code Playgroud)

上面的 UPDATE 通过,这是问题,因为description不允许列具有 NULL 值

小智 6

问题出在您的数据库配置中。MariaDB 默认情况下 SQL_MODE 不是 STRICT 和 UPDATEs,即使它设置为 NOT NULL。

但这是一个指向答案的指针:

至少启用 STRICT_TRANS_TABLES 或 STRICT_ALL_TABLES 之一的模式称为严格模式。如果未设置严格模式(默认),MariaDB 会自动调整无效值,例如截断过长的字符串,或调整超出范围的数值,并产生警告。

设置严格模式后,语句将失败,并返回错误。当设置严格模式以将错误转换为警告时,可以使用 IGNORE 关键字。

因此,您需要按照以下说明设置适当的 SQL_MOD:https ://mariadb.com/kb/en/mariadb/sql_mode/