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)

原文地址:https://www.cnblogs.com/lixuebin/p/10814116.html