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)

  • 相关阅读:
    ZJNU 1129 The sum problem——中级
    用 PHP 实现 POP3 邮件的收取(3)
    用 PHP 实现 POP3 邮件的收取(2)
    PHP4 调用自己编写的 COM 组件
    用 PHPLIB 进行 Session 的管理和认证
    用 PHP 实现 POP3 邮件的收取(1)
    用 PHP 实现 POP3 邮件的解码(1)
    PHP 应用程序的性能优化
    PHP功能齐全的发送邮件类
    怎样在 php 中使用 PDF 文档功能
  • 原文地址:https://www.cnblogs.com/lixuebin/p/10814116.html
Copyright © 2011-2022 走看看