簡體   English   中英

在 MySql 列中接受空值,但默認情況下不接受

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM