zoukankan      html  css  js  c++  java
  • MariaDB Dynamic&Virtual Column

    MariaDB Dynamic&Virtual Column

    Dynamic Column
    Dynamic Column的限制
    1.单个dynamic column最多65535例
    2.不管max_allowed_packet是多少,dynamic column最大长度为1GB

    CREATE DATABASE IF NOT EXISTS test;
    USE test;  
    CREATE TABLE dyn_example (
         id SERIAL PRIMARY KEY,
         dyn_cols BLOB
    );


    INSERT
    COLUMN_CREATE(column_name, value [AS type][, column_name, value [AS type]]...); 

    INSERT INTO dyn_example (dyn_cols) VALUES
             (COLUMN_CREATE('name','t-shirt', 'color','blue' AS CHAR, 'size','XL' AS CHAR)),
             (COLUMN_CREATE('name','t-shirt', 'color','blue' AS CHAR, 'size','L' AS CHAR)),
             (COLUMN_CREATE('name','t-shirt', 'color','black' AS CHAR, 'size','M' AS CHAR)),
             (COLUMN_CREATE('name','flashlight', 'color','black' AS CHAR, 'size','AAA' AS CHAR, 'num', 2 AS INT)),
             (COLUMN_CREATE('name','shovel', 'length','5'));
    COLUMN_LIST(dyncol_blob_name); 
    

    (jlive)[test]>SELECT id, COLUMN_LIST(dyn_cols) FROM dyn_example;

    +----+-----------------------------+

    | id | COLUMN_LIST(dyn_cols)       |

    +----+-----------------------------+

    1 | `name`,`size`,`color`       |

    2 | `name`,`size`,`color`       |

    3 | `name`,`size`,`color`       |

    4 | `num`,`name`,`size`,`color` |

    5 | `name`,`length`             |

    +----+-----------------------------+

    5 rows in set (0.01 sec)

    UPDATE
    COLUMN_ADD(dyncol_blob_name, column_name, value [AS type][, column_name, value [AS type]]...); 

    UPDATE dyn_example SET dyn_cols=COLUMN_ADD(dyn_cols, 'name', 'torch') WHERE COLUMN_GET(dyn_cols, 'name' AS CHAR) = 'flashlight';

    ADD
     UPDATE dyn_example SET dyn_cols=COLUMN_ADD(dyn_cols,'length', 6) WHERE COLUMN_GET(dyn_cols, 'name' AS CHAR) = 'torch';

    (jlive)[test]>SELECT id, COLUMN_LIST(dyn_cols) FROM dyn_example;                                    +----+--------------------------------------+

    | id | COLUMN_LIST(dyn_cols)                |

    +----+--------------------------------------+

    1 | `name`,`size`,`color`                |

    2 | `name`,`size`,`color`                |

    3 | `name`,`size`,`color`                |

    4 | `num`,`name`,`size`,`color`,`length` |

    5 | `name`,`length`                      |

    +----+--------------------------------------+

    5 rows in set (0.00 sec)

    DELETE
    COLUMN_DELETE(dyncol_blob_name, column_name[, column_name]...); 

    UPDATE dyn_example SET dyn_cols=COLUMN_DELETE(dyn_cols,'length') WHERE COLUMN_GET(dyn_cols, 'name' AS CHAR) = 'shovel';

    (jlive)[test]>SELECT id, COLUMN_LIST(dyn_cols) FROM dyn_example;                                    +----+--------------------------------------+

    | id | COLUMN_LIST(dyn_cols)                |

    +----+--------------------------------------+

    1 | `name`,`size`,`color`                |

    2 | `name`,`size`,`color`                |

    3 | `name`,`size`,`color`                |

    4 | `num`,`name`,`size`,`color`,`length` |

    5 | `name`                               |

    +----+--------------------------------------+

    5 rows in set (0.00 sec)


    嵌套
     INSERT INTO dyn_example (dyn_cols) VALUES
      (COLUMN_CREATE('type','parent', 'name', 'Mary',
        'child1', COLUMN_CREATE('name', 'Sue', 'eyes','brown'),
        'child2', COLUMN_CREATE('name', 'Bob',
        'grandchild', COLUMN_CREATE('name', 'baby'))
      ));

    (jlive)[test]>SELECT id, COLUMN_LIST(dyn_cols) FROM dyn_example;

    +----+--------------------------------------+

    | id | COLUMN_LIST(dyn_cols)                |

    +----+--------------------------------------+

    1 | `name`,`size`,`color`                |

    2 | `name`,`size`,`color`                |

    3 | `name`,`size`,`color`                |

    4 | `num`,`name`,`size`,`color`,`length` |

    5 | `name`                               |

    6 | `name`,`type`,`child1`,`child2`      |

    +----+--------------------------------------+

    6 rows in set (0.00 sec)


    dynamic column查询

    COLUMN_GET(dyncol_blob_name, column_name AS type); 


    SELECT id,

             COLUMN_GET(dyn_cols, 'name' AS CHAR) AS 'name',

             COLUMN_GET(dyn_cols, 'color' AS CHAR) AS 'color',

             COLUMN_GET(dyn_cols, 'size' AS CHAR) AS 'size',

             COLUMN_GET(dyn_cols, 'num' AS INT) AS 'num'

    FROM dyn_example;


    +----+---------+-------+------+------+

    | id | name    | color | size | num  |

    +----+---------+-------+------+------+

    1 | t-shirt | blue  | XL   | NULL |

    2 | t-shirt | blue  | L    | NULL |

    3 | t-shirt | black | M    | NULL |

    4 | torch   | black | AAA    2 |

    5 | shovel  | NULL  | NULL | NULL |

    6 | Mary    | NULL  | NULL | NULL |

    +----+---------+-------+------+------+

     

    6 rows in set (0.00 sec)


    以JSON格式显示

    COLUMN_JSON(dyncol_blob_name);


    (jlive)[test]>SELECT id, COLUMN_JSON(dyn_cols) FROM dyn_example;

    +----+-----------------------------------------------------------------------------------------------------------------------------+

    | id | COLUMN_JSON(dyn_cols)                                                                                                       |

    +----+-----------------------------------------------------------------------------------------------------------------------------+

    1 | {"name":"t-shirt","size":"XL","color":"blue"}                                                                               |

    2 | {"name":"t-shirt","size":"L","color":"blue"}                                                                                |

    3 | {"name":"t-shirt","size":"M","color":"black"}                                                                               |

    4 | {"num":2,"name":"torch","size":"AAA","color":"black","length":6}                                                            |

    5 | {"name":"shovel"}                                                                                                           |

    6 | {"name":"Mary","type":"parent","child1":{"eyes":"brown","name":"Sue"},"child2":{"name":"Bob","grandchild":{"name":"baby"}}} |

    +----+-----------------------------------------------------------------------------------------------------------------------------+

     

    6 rows in set (0.00 sec)


    检查BLOB num列存在性

    COLUMN_EXISTS(dyncol_blob_name, column_name); 


    (jlive)[test]>SELECT id, COLUMN_EXISTS(dyn_cols, 'num') FROM dyn_example;

    +----+--------------------------------+

    | id | COLUMN_EXISTS(dyn_cols, 'num') |

    +----+--------------------------------+

    1 |                              0 |

    2 |                              0 |

    3 |                              0 |

    4 |                              1 |

    5 |                              0 |

    6 |                              0 |

    +----+--------------------------------+

     

    6 rows in set (0.00 sec)


    检查BLOB是否合法

    COLUMN_CHECK(dyncol_blob_name); 


    (jlive)[test]>SELECT id, COLUMN_CHECK(dyn_cols)   FROM dyn_example;

    +----+------------------------+

    | id | COLUMN_CHECK(dyn_cols) |

    +----+------------------------+

    1 |                      1 |

    2 |                      1 |

    3 |                      1 |

    4 |                      1 |

    5 |                      1 |

    6 |                      1 |

    +----+------------------------+

     

    6 rows in set (0.00 sec)


    查询嵌套值

    SELECT

      COLUMN_GET(dyn_cols, 'child1' AS CHAR) as 'child1',

      COLUMN_GET(dyn_cols, 'child2' AS CHAR) as 'child2'

    FROM dyn_example WHERE

     

      COLUMN_GET(dyn_cols, 'type' AS CHAR) = 'parent';

    +---------------------------------+---------------------------------------------------+

    | child1                          | child2                                            |

    +---------------------------------+---------------------------------------------------+

        c eyesname!brown!Sue |       H namegrandchild!Bob     name!baby |

    +---------------------------------+---------------------------------------------------+

     

    1 row in set (0.00 sec)


    SELECT COLUMN_JSON(dyn_cols) FROM dyn_example WHERE  COLUMN_GET(dyn_cols, 'type' AS CHAR) = 'parent';

    +-----------------------------------------------------------------------------------------------------------------------------+

    | COLUMN_JSON(dyn_cols)                                                                                                       |

    +-----------------------------------------------------------------------------------------------------------------------------+

    | {"name":"Mary","type":"parent","child1":{"eyes":"brown","name":"Sue"},"child2":{"name":"Bob","grandchild":{"name":"baby"}}} |

    +-----------------------------------------------------------------------------------------------------------------------------+

     

    1 row in set (0.00 sec)



    Virtual Column

    https://mariadb.com/kb/en/virtual-columns/

    CREATE DATABASE IF NOT EXISTS test;

    USE test; 

    CREATE TABLE virt_cols (

             id SERIAL PRIMARY KEY,

             surname VARCHAR(64),

             givenname VARCHAR(64),

             uid INT AS (id + 1000) VIRTUAL,

     

             username VARCHAR(6) AS (LOWER(CONCAT(LEFT(givenname,1),(LEFT(surname,5))))) PERSISTENT);

    说明:

    1.PERSISTENT直接存储在数据库中,VIRTUAL则每次通过计算得出,不存储在数据库中

    2.只支持InnoDB,XtraDB,Aria,MyISAM


    (jlive)[test]>DESC virt_cols;

    +-----------+---------------------+------+-----+---------+----------------+

    | Field     | Type                | Null | Key | Default | Extra          |

    +-----------+---------------------+------+-----+---------+----------------+

    | id        | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |

    | surname   | varchar(64)         | YES  |     | NULL                  |

    | givenname | varchar(64)         | YES  |     | NULL                  |

    | uid       | int(11)             | YES  |     | NULL    | VIRTUAL        |

    | username  | varchar(6)          | YES  |     | NULL    | PERSISTENT     |

    +-----------+---------------------+------+-----+---------+----------------+

     

    5 rows in set (0.00 sec)


    INSERT INTO virt_cols (surname,givenname) VALUES

             ('Packer','Boyd'),

             ('Uchtdorf','Dieter'),

             ('Ballard','Russell'),

             ('Holland','Jeffrey'),

             ('Cook','Quentin'),

             ('Bednar','David');

    INSERT INTO virt_cols (surname,givenname,uid,username) VALUES

             ('Christofferson','Todd', DEFAULT, DEFAULT),

     

             ('Andersen','Neil', DEFAULT, DEFAULT);

    (jlive)[test]>SELECT * FROM virt_cols;

    +----+----------------+-----------+------+----------+

    | id | surname        | givenname | uid  | username |

    +----+----------------+-----------+------+----------+

    1 | Packer         | Boyd      | 1001 | bpacke   |

    2 | Uchtdorf       | Dieter    | 1002 | duchtd   |

    3 | Ballard        | Russell   | 1003 | rballa   |

    4 | Holland        | Jeffrey   | 1004 | jholla   |

    5 | Cook           | Quentin   | 1005 | qcook    |

    6 | Bednar         | David     | 1006 | dbedna   |

    7 | Christofferson | Todd      | 1007 | tchris   |

    8 | Andersen       | Neil      | 1008 | nander   |

    +----+----------------+-----------+------+----------+

     

    8 rows in set (0.00 sec)

  • 相关阅读:
    io学习
    asp.net文件上传进度条研究
    asp.net页面中的Console.WriteLine结果如何查看
    谨慎跟随初始目的不被关联问题带偏
    android 按钮特效 波纹 Android button effects ripple
    安卓工作室 日志设置
    安卓工作室 文件浏览器 android studio File browser
    一个新的Android Studio 2.3.3可以在稳定的频道中使用。A new Android Studio 2.3.3 is available in the stable channel.
    新巴巴运动网上商城 项目 快速搭建 教程 The new babar sports online mall project quickly builds a tutorial
    码云,git使用 教程-便签
  • 原文地址:https://www.cnblogs.com/lixuebin/p/10814116.html
Copyright © 2011-2022 走看看