![](/img/trans.png)
[英]MySQL: COLUMN_DEFAULT is always NULL for non null default values
[英]Accept null values but not by default in a MySql column
我就是找不到我的問題的答案。 如果有堆棧溢出,只需發布它,我將刪除我的帖子。
我的問題:
我想在 mysql 列中接受null
值,但默認情況下不接受。 當我插入一行時,我還應該為該列設置一個值,這應該是必需的。
現在,在 phpmyadmin 中,如果我選中Null字段(接受null
值),則字段Default (默認值)將自動設置為null
值。 這意味着我可以省略在insert
查詢中為該列設置值,它將自動填充為null
值。
我什么時候說過如果未設置列應自動填充? 我說接受空值,而不是自動填充。
我錯過了什么嗎?
如果列具有NULL
屬性,並且您沒有指定顯式DEFAULT
屬性,就好像您使用DEFAULT NULL
定義了它。 這在“隱式默認處理”的文檔中指定:
如果列可以將 NULL 作為值,則使用顯式 DEFAULT NULL 子句定義該列。
如果您想防止在插入時省略列,我認為您可以通過指定導致錯誤的DEFAULT
表達式來實現。 這要求您至少使用 MySQL 8.0.13 版本,因為在此之前DEFAULT
必須是文字,而不是表達式。
引用文檔:
隱式默認處理
如果數據類型規范不包含顯式 DEFAULT 值,MySQL 確定默認值如下: 如果列可以將 NULL 作為值,則使用顯式 DEFAULT NULL 子句定義該列。
因此,如果您的列可以為空,則它始終具有默認值 - 無論是顯式設置(通過DEFAULT ...
子句)還是隱式設置(如上所述)。
正如@Barmar 所注意到的,(至少在理論上)有一種方法可以通過提供始終失敗的 DEFAULT 表達式來處理此問題(因為 MySQL 8.0.13 允許它)。
另一種方法(在 8.0.13 之前的版本上可用)是設置一個無論如何都不應該放在您的列中的 DEFAULT 值,並創建一個預插入觸發器,根據這種特殊情況檢查插入的值。
這種方法的好處是您可以更靈活地為這種情況提供特定的錯誤。 缺點是您可能認為特殊的值最終會被實際場景實際使用,從而導致一個非常奇怪的錯誤。 這更容易防止數字(0 表示未簽名的 ID 等),但對於用戶創建的字符串和類似實體則更難。
您可以通過創建一個接受空值的列,然后應用一個觸發器 BEFORE INSERT 來檢查空值來做到這一點。
例如:
CREATE TABLE `testNulls` (
`id` int NOT NULL AUTO_INCREMENT,
`nullField` varchar(45) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `id_UNIQUE` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 ;
現在創建一個觸發器
DELIMITER $$
CREATE TRIGGER `testNulls_BEFORE_INSERT` BEFORE INSERT ON `testNulls` FOR EACH ROW BEGIN
if (new.nullField is null) then
signal sqlstate '45000' set message_text = 'Cannot insert NULL in nullField';
END IF;
END$$
DELIMITER ;
嘗試在nullField
列中插入 NULL 將返回錯誤 45000,但將行更新為包含 NULL 會成功。
使用 MySQL 8 Demo 測試: https : //www.db-fiddle.com/f/8eV4VihbeB5woEYwuGMFvK/0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.