Подтвердить что ты не робот

Создавать комментарии для просмотров в mysql

Я вижу, что представления имеют поле комментариев, как и обычные таблицы, но по умолчанию заполняются значением "VIEW".

[TABLE_CATALOG] => 
[TABLE_SCHEMA] => xxx
[TABLE_NAME] => view__xxxx
[TABLE_TYPE] => VIEW
[ENGINE] => 
[VERSION] => 
[ROW_FORMAT] => 
[TABLE_ROWS] => 
[AVG_ROW_LENGTH] => 
[DATA_LENGTH] => 
[MAX_DATA_LENGTH] => 
[INDEX_LENGTH] => 
[DATA_FREE] => 
[AUTO_INCREMENT] => 
[CREATE_TIME] => 
[UPDATE_TIME] => 
[CHECK_TIME] => 
[TABLE_COLLATION] => 
[CHECKSUM] => 
[CREATE_OPTIONS] => 
[TABLE_COMMENT] => VIEW

Когда я пытаюсь создать представление с комментарием, я получаю сообщение об ошибке.

CREATE OR REPLACE VIEW view__x AS
SELECT 
 * 
FROM `some_table`  
COMMENT = 'some comment'

Есть ли способ изменить поле комментария или это поле используется внутри для чего-то еще и должно оставаться таким, как оно есть?

Я добавил запрос функции в mysql.

4b9b3361

Ответ 1

В соответствии с синтаксисом create view нет способа добавить комментарий в комментарии:

Эта функция запрашивалась несколько раз. Существует четыре активных билета, связанных с этой функциональностью:

... и несколько отмеченных как дубликаты: 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

Если вас интересует эта проблема, перейдите к четырем активным билетам, нажмите кнопку "влияет на меня", а также добавьте комментарий, спрашивая, работает ли кто-нибудь над этой функцией.

Это добавит видимость и увеличит вероятность того, что она будет реализована.

Ответ 2

Вы можете самостоятельно создавать комментарии к представлениям, создав таблицу в своей схеме для хранения комментариев к каждому представлению. Затем присоедините information_schema.tables к новой таблице.

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

- комментарии уровня представления и уровня таблицы теперь отображаются в 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>

Ответ 3

У меня была похожая потребность, и одним из способов, которым я взломал это в MySQL, было добавление правдивого предиката в предложении WHERE, которое служило документацией. Я признаю, что это глупо, но разве вы не согласитесь, что документация лучше, чем документация вообще? Однажды приятный побочный эффект от выполнения ваших комментариев таким образом переживет mysqldump. Насколько я знаю, оптимизатору не помешает дополнительный правдивый предикат.

Пример создания вида:

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.';

А потом просматриваете документацию...

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