Mariadb

INSERT 不能與 NOT NULL 一起使用,但 UPDATE 可以,為什麼?

  • October 23, 2015

我有這個表定義:

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。

但這是指向答案的指針:

至少啟用 STRICT_TRANS_TABLES 或 STRICT_ALL_TABLES 之一的模式稱為嚴格模式。在未設置嚴格模式(預設)的情況下,MariaDB 會自動調整無效值,例如截斷過長的字元串,或調整超出範圍的數值,並產生警告。

設置了嚴格模式,語句將失敗,而是返回錯誤。當設置嚴格模式以將錯誤轉換為警告時,可以使用 IGNORE 關鍵字。

因此,您需要設置適當的 SQL_MOD,如下所述:https ://mariadb.com/kb/en/mariadb/sql_mode/

引用自:https://dba.stackexchange.com/questions/118957