MySQL 5.7新特性之generated column

MySQL 5.7引入了generated column,這篇文章簡單地介紹了generated column的使用方法和注意事項,爲讀者瞭解MySQL 5.7提供一個快速的、完整的教程。這篇文章圍繞如下幾個問題展開:mysql

  1. generated column是什麼
  2. virtual column與stored column的區別
  3. 若是我對generated column作一些破壞行爲會怎麼樣
  4. generated column上建立索引
  5. generated column上建立索引與Oracle的函數索引的區別

1. generated column是什麼

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 |
+-------+-------+--------------------+

 

2. virtual generated column與stored generated column的區別

在MySQL 5.7中,支持兩種generated column,即virtual generated column和stored generated column,前者只將generated column保存在數據字典中(表的元數據),並不會將這一列數據持久化到磁盤上;後者會將generated column持久化到磁盤上,而不是每次讀取的時候計算所得。很明顯,後者存放了能夠經過已有數據計算而得的數據,須要更多的磁盤空間,與virtual column相比並無優點,所以,MySQL 5.7中,不指定generated column的類型,默認是virtual column。此外:函數

  • stored generated column性能較差,見這裏
  • 若是須要stored generated column的話,可能在generated column上創建索引更加合適,見本文第4部分的介紹

綜上,通常狀況下,都使用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
)

 

3. 若是我對generated column作一些破壞行爲會怎麼樣

咱們已經知道了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.
相關文章
相關標籤/搜索