Mysql

有沒有辦法強制至少一列 NOT NULL

  • December 23, 2019

我有一個schedule_daysid, day, date列的表。

id - 自動遞增,主鍵

day - weekday - enum(weekdays) 預設不為空

date - 特定日期 - 預設不為空

時刻表是火車時刻表。除了任何特定日期(例如任何節日)外,所有周都將具有相同的常式。因此,我將兩者都設置為 null ,因為我想設置其中一個dayor date

如果指定了日期,那麼我可以從中獲取日期,因此詢問或強制使用者設置日期是沒有意義的,這可能會導致人為錯誤。

我可能會使用TRIGGER但想知道在**MySQL 中是否有更好的方法 - 8.0.***版本

表查詢

CREATE TABLE IF NOT EXISTS schedule_days
(
   id   INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
   day  ENUM ('SUNDAY', 'MONDAY', 'TUESDAY', 'WEDNESDAY', 'THURSDAY', 'FRIDAY', 'SATURDAY') DEFAULT NULL,
   date DATE DEFAULT NULL,
   INDEX staff_index (day),
   CONSTRAINT day_day_check CHECK (`day` IS NULL + `date` IS NULL = 1) # check constraint
) ENGINE = INNODB;

如果您使用 8.0.16 或更高版本,請使用CHECK 約束

就像是

CHECK COALESCE(`day`, `date`) IS NOT NULL 

對於“至少一個不為空”,或

CHECK `day` IS NULL + `date` IS NULL = 1

因為“強烈一不為空”。

在@Akina的幫助下,我能夠解決這個問題。熙是最後的詢問。

我已經CONSTRAINT使用CHECK(如@Akina建議的那樣)創建了day任一dateIS NOT NULL

CONSTRAINT day_date_check CHECK ((day IS NOT NULL) OR (date IS NOT NULL))

表查詢

CREATE TABLE IF NOT EXISTS schedule_days
(
   id   INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
   day  ENUM ('SUNDAY', 'MONDAY', 'TUESDAY', 'WEDNESDAY', 'THURSDAY', 'FRIDAY', 'SATURDAY') DEFAULT NULL,
   date DATE DEFAULT NULL,
   INDEX schedule_day (day),
   CONSTRAINT day_date_check CHECK ((day IS NOT NULL) OR (date IS NOT NULL))
) ENGINE = INNODB;

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