我有这个表定义:
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;
每次我尝试插入一条新记录时,由于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)
上面的 INSERT 失败,因为数据库中的 CONSTRAINTS
UPDATE media SET description = null, updatedAt = "2015-10-22 22:12:18" WHERE id = 13
上面的 UPDATE 通过了,这就是问题所在,因为description
不允许列具有 NULL 值
问题出在您的数据库配置中。MariaDB 默认情况下 SQL_MODE 不是 STRICT 和 UPDATE,即使它设置为 NOT NULL。
但这是指向答案的指针:
因此,您需要设置适当的 SQL_MOD,如下所述:https ://mariadb.com/kb/en/mariadb/sql_mode/