技術譯文 MySQL 8 中檢查約束的使用

2021-10-10 14:28:51 字數 2679 閱讀 3474

這是一項新功能,用於指定在插入或更新到一行之前檢查值的條件。如果表的任何行的搜尋條件的結果為 false,則約束可能返回錯誤(但如果結果為 unknown 或 true,則約束不會返回錯誤)。

此功能開始在 mysql 8.0.16 上執行,在以前的版本中,我們可以建立它,但它不起作用,這意味著支援語法,但不起作用。

要牢記的使用規則:

我建立了下表來測試此功能。如示例所示,這非常簡單:

create table users (

id int not null auto_increment,

firstname varchar(50) not null,

lastname varchar(50) not null,

age tinyint unsigned not null constraint `check_1` check (age > 15),

gender enum('m', 'f') not null,

primary key (id)

) engine = innodb;

在這個簡單的測試中,僅當age > 15時,我們才能寫入或更新行。

讓我們看乙個示例,嘗試插入age < 15的行:

mysql> insert into users set firstname = 'name1', lastname = 'lastname1', age = 10, gender = 'm';

error 3819 (hy000): check constraint 'check_1' is violated.

alter table users drop check check_1;
alter table users

add constraint gender_male

check (

case

when gender = 'm'

then

case

when age >= 21

then 1

else 0

endelse 1

end = 1

);alter table users

add constraint gender_female

check (

case

when gender = 'f'

then

case

when age >= 18

then 1

else 0

endelse 1

end = 1

);

我們新增了更多邏輯,現在它取決於***age列。當且僅當錶行的指定條件評估為 true 或 unknown(對於 null 列值)時,才滿足 check 監測約束,否則違反約束。

讓我們從前面的邏輯中看乙個例子。

mysql> insert into users set firstname = 'name2', lastname = 'lastname2', age = 10, gender = 'f';

error 3819 (hy000): check constraint 'gender_female' is violated.

mysql> insert into users set firstname = 'name3', lastname = 'lastname3', age = 10, gender = 'm';

error 3819 (hy000): check constraint 'gender_male' is violated.

如您在 error 訊息中所見,mysql 正在顯示 check 約束名稱。可以從應用程式源**中使用它來除錯錯誤並知道從哪個 check 失敗。

最後,這是表結構:

create table `users` (

`id` int(11) not null auto_increment,

`firstname` varchar(50) not null,

`lastname` varchar(50) not null,

`age` tinyint(3) unsigned not null,

`gender` enum('m','f') not null,

primary key (`id`),

constraint `gender_female` check (((case when (`gender` = 'f') then (case when (`age` > 18) then 1 else 0 end) else 1 end) = 1)),

constraint `gender_male` check (((case when (`gender` = 'm') then (case when (`age` > 21) then 1 else 0 end) else 1 end) = 1))

) engine=innodb auto_increment=4;

我們可以使用此功能在表中新增更多的邏輯,但是根據我以前作為程式設計師的經驗,我不建議在表中新增邏輯,因為除非您無法訪問應用程式**,否則很難找到或除錯錯誤。

mysql8問題 mysql8中的問題

only full group by 對於group by聚合操作,如果在 select 中的列,沒有在 group by 現,那麼這個sql是不合法的,因為列不在group by從句中。no auto value on zero 該值影響自增長列的插入。預設設定下,插入0或null代表生成下乙個自...

mysql 複製功能 MySQL 8中的新複製功能

mysql 複製功能 今年在percona live開源資料庫會議上,我將發表有關mysql 8.0中最新複製功能的演講。使用mysql 5.7.17發行mysql group replication外掛程式是一項艱鉅的工作。組複製是乙個新外掛程式,它可以通過組通訊和狀態機複製為使用者提供一些不錯的...

MySQL 8 中新的複製功能

mysql 8 中新的複製功能使得操作更加方便,並幫助使用者更好地觀察複製過程中內部發生的情況。使用 mysql 5.7.17 獲取 mysql 組複製外掛程式是一項巨大的工作。組複製是乙個新的外掛程式,通過使用組通訊和狀態機複製,為使用者提供了一些不錯的複製屬性。這使得系統能夠免受 腦裂 情況影響...