Create comments for views in mysql

后端 未结 3 1436
北恋
北恋 2020-12-09 16:05

I see that the views have a comment field just like the regular tables, but is by default populated with the \"VIEW\" value.

[TABLE_CATALOG] => 
[TABLE_S         


        
相关标签:
3条回答
  • 2020-12-09 16:11

    According to the create view syntax there is no way currently to add comment a view:

    • http://dev.mysql.com/doc/refman/5.7/en/create-view.html

    This feature has been requested several times. There are four active tickets related to this functionality:

    • http://bugs.mysql.com/bug.php?id=5159
    • http://bugs.mysql.com/bug.php?id=64045
    • http://bugs.mysql.com/bug.php?id=52429
    • http://bugs.mysql.com/bug.php?id=15344

    ...and several marked as duplicates: http://bugs.mysql.com/bug.php?id=19602 , http://bugs.mysql.com/bug.php?id=19602 , http://bugs.mysql.com/bug.php?id=13109 , http://bugs.mysql.com/bug.php?id=14369 , http://bugs.mysql.com/bug.php?id=11082 , http://bugs.mysql.com/bug.php?id=42870 , http://bugs.mysql.com/bug.php?id=38137 , http://bugs.mysql.com/bug.php?id=38137 , http://bugs.mysql.com/bug.php?id=30729

    If you are interested in this issue, go to the four active tickets, click the "affects me" button, and also add a comment, asking if anyone is working on this feature.

    This will add visibility, and increase the likelyhood of it being implemented.

    0 讨论(0)
  • 2020-12-09 16:19

    You can home brew comments on views by creating a table in your schema to store the comment on each view. Then join information_schema.tables to the new table.

    -- A view does not show the table-level comments of the underlying table.
    -- nor can a view have view-level comments
    
    CREATE TABLE `zztable` (
    -- A SQL statement comment. Not stored with the table. Just documents the create table code
      `zz_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'unique primary key. auto increment',
      `zz_descr` varchar(255) NOT NULL COMMENT 'descriptive name. must be unique if not null',
      PRIMARY KEY (`zz_id`),
      UNIQUE KEY `zz_descr_UNIQUE` (`zz_descr`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='a table demonstrating table, column, and view comments. ';
    
    -- select the table from information_schema
    SELECT table_type, table_name, table_rows, table_comment
    FROM information_schema.tables ta
    WHERE ta.table_name LIKE 'zztable%'
    ORDER BY ta.table_type, ta.table_name;
    
    -- create a view over the commented table
    CREATE OR REPLACE VIEW zztable_vw
    AS
    SELECT zz_id, zz_descr
    FROM zztable;
    
    -- now run the information_schema queries again to see the new view in the results
    -- MySQL does not allow view-level comments. 
    
    -- create a new table to contain the view-level comments
    CREATE TABLE IF NOT EXISTS `schema_view` (
      `schema_view_id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'unique primary key. auto increment. ',
      `schema_view_name` VARCHAR(64) NOT NULL COMMENT 'view name matches information_schema.tables.table_name for VIEW',
      `schema_view_comment` VARCHAR(2048) NULL DEFAULT NULL COMMENT 'the descriptive purpose of the view. ',
      PRIMARY KEY (`schema_view_id`))
    ENGINE = InnoDB
    COMMENT = 'contains comments for views since MySQL does not store view-level comments. Use this in a join on schema_view_name to information_schema.tables.table_name';
    
    CREATE UNIQUE INDEX `schema_view_name_UNIQUE` ON `schema_view` (`schema_view_name` ASC);
    
    -- insert a view comment
    SELECT * FROM schema_view;
    
    INSERT INTO schema_view
    (schema_view_name, schema_view_comment)
    VALUES ('zztable_vw' , 'a demonstration of documenting view metadata with comments');
    COMMIT;
    
    -- modify the query to join to the new schema_view table
    -- select the view from information_schema joined to the new table
    SELECT ta.table_type, ta.table_name, ta.table_rows, 
        -- show different comments based on table_type
        CASE 
            WHEN ta.table_type = 'BASE TABLE' THEN ta.table_comment
            WHEN ta.table_type = 'VIEW' THEN sv.schema_view_comment
            ELSE NULL
        END AS schema_comment,
        ta.table_comment, 
        sv.schema_view_comment
    FROM information_schema.tables ta
    -- Show view comments if it exists.
    LEFT OUTER JOIN schema_view sv
      ON ta.table_name = sv.schema_view_name
    WHERE ta.table_name LIKE 'zztable%'
    ORDER BY ta.table_type, ta.table_name;
    
    -- simplify future queries by creating a view
    CREATE OR REPLACE VIEW `schema_table_vw`
    AS
    SELECT ta.table_type, ta.table_name, ta.table_rows, 
        -- show different comments based on type
        CASE 
            WHEN ta.table_type = 'BASE TABLE' THEN ta.table_comment
            WHEN ta.table_type = 'VIEW' THEN sv.schema_view_comment
            ELSE NULL
        END AS schema_comment
    FROM information_schema.tables ta
    -- Show view comments if it exists.
    LEFT OUTER JOIN schema_view sv
      ON ta.table_name = sv.schema_view_name
    WHERE ta.table_schema = 'my_schema'
    ORDER BY ta.table_type, ta.table_name;
    

    -- view-level and table-level comments now show in schema_comment

    <table width="200" border="1">
      <tr>
        <th scope="col">table_type</th>
        <th scope="col">table_name</th>
        <th scope="col">table_rows</th>
        <th scope="col">schema_comment</th>
        <th scope="col">table_comment</th>
        <th scope="col">schema_view_comment</th>
      </tr>
      <tr>
        <td>BASE TABLE</td>
        <td>zztable</td>
        <td>0</td>
        <td>a table demonstrating table, column, and view comments.</td>
        <td>a table demonstrating table, column, and view comments.</td>
        <td>NULL</td>
      </tr>
      <tr>
        <td>VIEW</td>
        <td>zztable_vw</td>
        <td>NULL</td>
        <td>a demonstration of documenting view metadata with comments</td>
        <td>VIEW</td>
        <td>a demonstration of documenting view metadata with comments</td>
      </tr>
    </table>

    0 讨论(0)
  • 2020-12-09 16:30

    I had a similar need, and one way I hacked this in MySQL was to add a truthy predicate in the WHERE clause that served as documentation. I admit this is hacky, but wouldn't you agree any documentation is better than no documentation at all? Once nice side-effect of doing your commentary this way will survive a mysqldump. As far as I know, the optimizer will not be hindered by the extra truthy predicate.

    Example view creation:

    CREATE OR REPLACE VIEW high_value_employees AS
    SELECT *
    FROM `employees`
    WHERE salary >= 200000
    AND 'comment' != 'This view was made by Josh at the request of an important VP who wanted a concise list of who we might be overpaying. Last modified on 26 July 2019.';
    

    And then viewing the documentation ...

    > SHOW CREATE TABLE high_value_employees \G
    *************************** 1. row ***************************
                    View: high_value_employees
             Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`jhuber`@`%` SQL SECURITY 
    DEFINER VIEW `high_value_employees` AS select `employees`.`salary` AS `salary` from
    `employees` where ((`employees`.`salary` >= 200000) and ('comment' <> 'This view was
    made by Josh at the request of an important VP who wanted a concise list of who we
    might be overpaying. Last modified on 26 July 2019.'))
    character_set_client: utf8mb4
    collation_connection: utf8mb4_general_ci
    1 row in set (0.00 sec)
    
    0 讨论(0)
提交回复
热议问题