MySQL 5.7引入了generated column,這篇文章簡單地介紹了generated column的使用方法和注意事項,爲讀者瞭解MySQL 5.7提供一個快速的、完整的教程。這篇文章圍繞如下幾個問題展開:mysql
generated column是MySQL 5.7引入的新特性,所謂generated column,就是數據庫中這一列由其餘列計算而得,咱們以官方參考手冊中的例子予以說明。sql
例如,知道直角三角形的兩條直角邊,要求斜邊的長度。很明顯,斜邊的長度能夠經過兩條直角邊計算而得,那麼,這時候就能夠在數據庫中只存放直角邊,斜邊使用generated column,以下所示:數據庫
CREATE TABLE triangle ( sidea DOUBLE, sideb DOUBLE, sidec DOUBLE AS (SQRT(sidea * sidea + sideb * sideb)) ); INSERT INTO triangle (sidea, sideb) VALUES(1,1),(3,4),(6,8);
查詢結果:ide
mysql> SELECT * FROM triangle; +-------+-------+--------------------+ | sidea | sideb | sidec | +-------+-------+--------------------+ | 1 | 1 | 1.4142135623730951 | | 3 | 4 | 5 | | 6 | 8 | 10 | +-------+-------+--------------------+
在MySQL 5.7中,支持兩種generated column,即virtual generated column和stored generated column,前者只將generated column保存在數據字典中(表的元數據),並不會將這一列數據持久化到磁盤上;後者會將generated column持久化到磁盤上,而不是每次讀取的時候計算所得。很明顯,後者存放了能夠經過已有數據計算而得的數據,須要更多的磁盤空間,與virtual column相比並無優點,所以,MySQL 5.7中,不指定generated column的類型,默認是virtual column。此外:函數
綜上,通常狀況下,都使用virtual generated column,這也是MySQL默認的方式,若是使用stored generated column,前面的建表語句將會是下面這樣,即多了一個stored
關鍵字:sqlserver
Create Table: CREATE TABLE `triangle` ( `sidea` double DEFAULT NULL, `sideb` double DEFAULT NULL, `sidec` double GENERATED ALWAYS AS (SQRT(sidea * sidea + sideb * sideb)) STORED )
咱們已經知道了generated column是什麼,而且知道了如何使用generated column,爲了不誤用,咱們先來進行一些實驗,以避免在具體使用時出現一些未知的狀況。性能
將generated column定義爲 「除以0」idea
若是咱們將generated column定義爲 「x列 / 0」,MySQL並不會直接報錯,而是在插入數據時報錯,並提示」ERROR 1365 (22012): Division by 0」code
mysql> create table t( x int, y int, z int generated always as( x / 0)); Query OK, 0 rows affected (0.22 sec) mysql> insert into t(x,y) values(1,1); ERROR 1365 (22012): Division by 0
若是咱們將generated column定義爲 「x列/y列」,在插入數據,若是y列爲0的話,一樣提示錯誤,以下所示:server
mysql> create table t( x int, y int, z int generated always as( x / y)); Query OK, 0 rows affected (0.20 sec) mysql> insert into t(x,y) values(1,0); ERROR 1365 (22012): Division by 0
若是咱們將generated column定義爲 「x列/y列」,並嘗試刪除x列或y列,將提示」ERROR 3108 (HY000): Column ‘x’ has a generated column dependency.」
mysql> create table t( x int, y int, z int generated always as( x / y)); Query OK, 0 rows affected (0.24 sec) mysql> alter table t drop column x; ERROR 3108 (HY000): Column 'x' has a generated column dependency.