Mariadb
INSERT 不能與 NOT NULL 一起使用,但 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;
每次我嘗試插入一條新記錄時,我都會因為
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/