| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516 |
- {% extends 'table/page_with_secondary_tabs.twig' %}
- {% block content %}
- <form method="post" action="tbl_structure.php" name="fieldsForm" id="fieldsForm"
- class="ajax{{ hide_structure_actions ? ' HideStructureActions' }}">
- {{ get_hidden_inputs(db, table) }}
- <input type="hidden" name="table_type" value=
- {%- if db_is_system_schema -%}
- "information_schema"
- {%- elseif tbl_is_view -%}
- "view"
- {%- else -%}
- "table"
- {%- endif %}>
- <div class="responsivetable">
- <table id="tablestructure" class="data topmargin">
- {# Table header #}
- <thead>
- <tr>
- <th class="print_ignore"></th>
- <th>#</th>
- <th>{% trans 'Name' %}</th>
- <th>{% trans 'Type' %}</th>
- <th>{% trans 'Collation' %}</th>
- <th>{% trans 'Attributes' %}</th>
- <th>{% trans 'Null' %}</th>
- <th>{% trans 'Default' %}</th>
- {% if show_column_comments -%}
- <th>{% trans 'Comments' %}</th>
- {%- endif %}
- <th>{% trans 'Extra' %}</th>
- {# @see table/structure.js, function moreOptsMenuResize() #}
- {% if not db_is_system_schema and not tbl_is_view %}
- <th colspan="{{ show_icons('ActionLinksMode') ? '8' : '9' -}}
- " class="action print_ignore">{% trans 'Action' %}</th>
- {% endif %}
- </tr>
- </thead>
- <tbody>
- {# Table body #}
- {% set rownum = 0 %}
- {% for row in fields %}
- {% set rownum = rownum + 1 %}
- {% set extracted_columnspec = extracted_columnspecs[rownum] %}
- {% set field_name = row['Field']|e %}
- {# For column comments #}
- {% set comments = row_comments[rownum] %}
- {# Underline commented fields and display a hover-title (CSS only) #}
- <tr>
- <td class="center print_ignore">
- <input type="checkbox" class="checkall" name="selected_fld[]" value="{{ row['Field'] }}" id="checkbox_row_{{ rownum }}">
- </td>
- <td class="right">{{ rownum }}</td>
- <th class="nowrap">
- <label for="checkbox_row_{{ rownum }}">
- {% if displayed_fields[rownum].comment is defined %}
- <span class="commented_column" title="{{ displayed_fields[rownum].comment }}">{{ displayed_fields[rownum].text }}</span>
- {% else %}
- {{ displayed_fields[rownum].text }}
- {% endif %}
- {{ displayed_fields[rownum].icon|raw }}
- </label>
- </th>
- <td{{ 'set' != extracted_columnspec['type'] and 'enum' != extracted_columnspec['type'] ? ' class="nowrap"' }}>
- <bdo dir="ltr" lang="en">
- {{ extracted_columnspec['displayed_type']|raw }}
- {% if relation_commwork and relation_mimework and browse_mime
- and mime_map[row['Field']]['mimetype'] is defined %}
- <br>{% trans 'Media (MIME) type:' %} {{ mime_map[row['Field']]['mimetype']|replace({'_': '/'})|lower }}
- {% endif %}
- </bdo>
- </td>
- <td>
- {% if row['Collation'] is not empty %}
- <dfn title="{{ collations[row['Collation']].description }}">{{ collations[row['Collation']].name }}</dfn>
- {% endif %}
- </td>
- <td class="column_attribute nowrap">{{ attributes[rownum] }}</td>
- <td>{{ row['Null'] == 'YES' ? 'Yes'|trans : 'No'|trans }}</td>
- <td class="nowrap">
- {% if row['Default'] is not null %}
- {% if extracted_columnspec['type'] == 'bit' %}
- {{ row['Default']|convert_bit_default_value }}
- {% else %}
- {{ row['Default'] }}
- {% endif %}
- {% elseif row['Null'] == 'YES' %}
- <em>NULL</em>
- {% else %}
- <em>{% trans %}None{% context %}None for default{% endtrans %}</em>
- {% endif %}
- </td>
- {% if show_column_comments %}
- <td>
- {{ comments }}
- </td>
- {% endif %}
- <td class="nowrap">{{ row['Extra']|upper }}</td>
- {% if not tbl_is_view and not db_is_system_schema %}
- <td class="edit center print_ignore">
- <a class="change_column_anchor ajax" href="tbl_structure.php
- {{- url_query }}&field={{ row['Field']|url_encode }}&change_column=1">
- {{ titles['Change']|raw }}
- </a>
- </td>
- <td class="drop center print_ignore">
- <a class="drop_column_anchor ajax" href="sql.php" data-post="{{ url_query }}&sql_query=
- {{- ('ALTER TABLE ' ~ backquote(table)
- ~ ' DROP ' ~ backquote(row['Field']) ~ ';')|url_encode -}}
- &dropped_column={{ row['Field']|url_encode }}&purge=1&message_to_show=
- {{- ('Column %s has been dropped.'|trans|format(row['Field']|e))|url_encode }}">
- {{ titles['Drop']|raw }}
- </a>
- </td>
- {% endif %}
- {% if not tbl_is_view and not db_is_system_schema %}
- {% set type = extracted_columnspec['print_type'] is not empty ? extracted_columnspec['print_type'] %}
- <td class="print_ignore">
- <ul class="table-structure-actions resizable-menu">
- {% if hide_structure_actions %}
- <li class="submenu shown">
- <a href="#" class="tab nowrap">{{ get_icon('b_more', 'More'|trans) }}</a>
- <ul>
- {% endif %}
- {# Add primary #}
- {% include 'table/structure/action_row_in_structure_table.twig' with {
- 'type': type,
- 'tbl_storage_engine': tbl_storage_engine,
- 'class': 'primary nowrap',
- 'has_field': primary and primary.hasColumn(field_name),
- 'has_link_class': true,
- 'url_query': url_query,
- 'primary': primary,
- 'syntax': 'ADD PRIMARY KEY',
- 'message': 'A primary key has been added on %s.'|trans,
- 'action': 'Primary',
- 'titles': titles,
- 'row': row,
- 'is_primary': true,
- 'table': table
- } only %}
- {# Add unique #}
- {% include 'table/structure/action_row_in_structure_table.twig' with {
- 'type': type,
- 'tbl_storage_engine': tbl_storage_engine,
- 'class': 'add_unique unique nowrap',
- 'has_field': field_name in columns_with_unique_index,
- 'has_link_class': false,
- 'url_query': url_query,
- 'primary': primary,
- 'syntax': 'ADD UNIQUE',
- 'message': 'An index has been added on %s.'|trans,
- 'action': 'Unique',
- 'titles': titles,
- 'row': row,
- 'is_primary': false,
- 'table': table
- } only %}
- {# Add index #}
- {% include 'table/structure/action_row_in_structure_table.twig' with {
- 'type': type,
- 'tbl_storage_engine': tbl_storage_engine,
- 'class': 'add_index nowrap',
- 'has_field': false,
- 'has_link_class': false,
- 'url_query': url_query,
- 'primary': primary,
- 'syntax': 'ADD INDEX',
- 'message': 'An index has been added on %s.'|trans,
- 'action': 'Index',
- 'titles': titles,
- 'row': row,
- 'is_primary': false,
- 'table': table
- } only %}
- {# Add spatial #}
- {% set spatial_types = [
- 'geometry',
- 'point',
- 'linestring',
- 'polygon',
- 'multipoint',
- 'multilinestring',
- 'multipolygon',
- 'geomtrycollection'
- ] %}
- {% include 'table/structure/action_row_in_structure_table.twig' with {
- 'type': type,
- 'tbl_storage_engine': tbl_storage_engine,
- 'class': 'spatial nowrap',
- 'has_field': type not in spatial_types and
- (tbl_storage_engine == 'MYISAM' or mysql_int_version >= 50705),
- 'has_link_class': false,
- 'url_query': url_query,
- 'primary': primary,
- 'syntax': 'ADD SPATIAL',
- 'message': 'An index has been added on %s.'|trans,
- 'action': 'Spatial',
- 'titles': titles,
- 'row': row,
- 'is_primary': false,
- 'table': table
- } only %}
- {# FULLTEXT is possible on TEXT, CHAR and VARCHAR #}
- <li class="fulltext nowrap">
- {% if tbl_storage_engine is not empty and (
- tbl_storage_engine == 'MYISAM'
- or tbl_storage_engine == 'ARIA'
- or tbl_storage_engine == 'MARIA'
- or (tbl_storage_engine == 'INNODB' and mysql_int_version >= 50604)
- ) and ('text' in type or 'char' in type) %}
- <a rel="samepage" class="ajax add_key add_fulltext_anchor" href="tbl_structure.php"
- data-post="{{- url_query|raw }}&add_key=1&sql_query=
- {{- ('ALTER TABLE ' ~ backquote(table)
- ~ ' ADD FULLTEXT(' ~ backquote(row['Field'])
- ~ ');')|url_encode }}&message_to_show=
- {{- ('An index has been added on %s.'|trans|format(row['Field']|e))|url_encode }}">
- {{ titles['IdxFulltext']|raw }}
- </a>
- {% else %}
- {{ titles['NoIdxFulltext']|raw }}
- {% endif %}
- </li>
- {# Distinct value action #}
- <li class="browse nowrap">
- <a href="sql.php" data-post="{{ url_query|raw }}&sql_query=
- {{- ('SELECT COUNT(*) AS ' ~ backquote('Rows'|trans)
- ~ ', ' ~ backquote(row['Field'])
- ~ ' FROM ' ~ backquote(table)
- ~ ' GROUP BY ' ~ backquote(row['Field'])
- ~ ' ORDER BY ' ~ backquote(row['Field']))|url_encode -}}
- &is_browse_distinct=1">
- {{ titles['DistinctValues']|raw }}
- </a>
- </li>
- {% if central_columns_work %}
- <li class="browse nowrap">
- {% if row['Field'] in central_list %}
- <a href="#" class="central_columns remove_button">
- {{ get_icon('centralColumns_delete', 'Remove from central columns'|trans) }}
- </a>
- {% else %}
- <a href="#" class="central_columns add_button">
- {{ get_icon('centralColumns_add', 'Add to central columns'|trans) }}
- </a>
- {% endif %}
- </li>
- {% endif %}
- {% if hide_structure_actions %}
- </ul>
- </li>
- {% endif %}
- </ul>
- </td>
- {% endif %}
- </tr>
- {% endfor %}
- </tbody>
- </table>
- </div>
- <div class="print_ignore">
- {% include 'select_all.twig' with {
- 'pma_theme_image': pma_theme_image,
- 'text_dir': text_dir,
- 'form_name': 'fieldsForm'
- } only %}
- {{ get_button_or_image(
- 'submit_mult',
- 'mult_submit',
- 'Browse'|trans,
- 'b_browse',
- 'browse'
- ) }}
- {% if not tbl_is_view and not db_is_system_schema %}
- {{ get_button_or_image(
- 'submit_mult',
- 'mult_submit change_columns_anchor ajax',
- 'Change'|trans,
- 'b_edit',
- 'change'
- ) }}
- {{ get_button_or_image(
- 'submit_mult',
- 'mult_submit',
- 'Drop'|trans,
- 'b_drop',
- 'drop'
- ) }}
- {% if tbl_storage_engine != 'ARCHIVE' %}
- {{ get_button_or_image(
- 'submit_mult',
- 'mult_submit',
- 'Primary'|trans,
- 'b_primary',
- 'primary'
- ) }}
- {{ get_button_or_image(
- 'submit_mult',
- 'mult_submit',
- 'Unique'|trans,
- 'b_unique',
- 'unique'
- ) }}
- {{ get_button_or_image(
- 'submit_mult',
- 'mult_submit',
- 'Index'|trans,
- 'b_index',
- 'index'
- ) }}
- {{ get_button_or_image(
- 'submit_mult',
- 'mult_submit',
- 'Fulltext'|trans,
- 'b_ftext',
- 'ftext'
- ) }}
- {% if tbl_storage_engine is not empty and (
- tbl_storage_engine == 'MYISAM'
- or tbl_storage_engine == 'ARIA'
- or tbl_storage_engine == 'MARIA') %}
- {{ get_button_or_image(
- 'submit_mult',
- 'mult_submit',
- 'Fulltext'|trans,
- 'b_ftext',
- 'ftext'
- ) }}
- {% endif %}
- {% if central_columns_work %}
- {{ get_button_or_image(
- 'submit_mult',
- 'mult_submit',
- 'Add to central columns'|trans,
- 'centralColumns_add',
- 'add_to_central_columns'
- ) }}
- {{ get_button_or_image(
- 'submit_mult',
- 'mult_submit',
- 'Remove from central columns'|trans,
- 'centralColumns_delete',
- 'remove_from_central_columns'
- ) }}
- {% endif %}
- {% endif %}
- {% endif %}
- </div>
- </form>
- <hr class="print_ignore">
- <div id="move_columns_dialog" class="hide" title="{% trans 'Move columns' %}">
- <p>{% trans 'Move the columns by dragging them up and down.' %}</p>
- <form action="tbl_structure.php" name="move_column_form" id="move_column_form">
- <div>
- {{ get_hidden_inputs(db, table) }}
- <ul></ul>
- </div>
- </form>
- </div>
- {# Work on the table #}
- <div id="structure-action-links">
- {% if tbl_is_view and not db_is_system_schema %}
- {% set edit_view_url = 'view_create.php' ~ edit_view_url %}
- {{ link_or_button(
- edit_view_url,
- get_icon('b_edit', 'Edit view'|trans, true)
- ) }}
- {% endif %}
- <a href="#" id="printView">{{ get_icon('b_print', 'Print'|trans, true) }}</a>
- {% if not tbl_is_view and not db_is_system_schema %}
- {# Only display propose table structure for MySQL < 8.0 #}
- {% if mysql_int_version < 80000 or is_mariadb %}
- <a href="sql.php" data-post="{{ url_query|raw }}&session_max_rows=all&sql_query=
- {{- ('SELECT * FROM ' ~ backquote(table) ~ ' PROCEDURE ANALYSE()')|url_encode -}}
- " style="margin-right: 0;">
- {{ get_icon(
- 'b_tblanalyse',
- 'Propose table structure'|trans,
- true
- ) }}
- </a>
- {{ show_mysql_docu('procedure_analyse') }}
- {% endif %}
- {% if is_active %}
- <a href="tbl_tracking.php{{ url_query|raw }}">
- {{ get_icon('eye', 'Track table'|trans, true) }}
- </a>
- {% endif %}
- <a href="#" id="move_columns_anchor">
- {{ get_icon('b_move', 'Move columns'|trans, true) }}
- </a>
- <a href="normalization.php{{ url_query|raw }}">
- {{ get_icon('normalize', 'Normalize'|trans, true) }}
- </a>
- {% endif %}
- {% if tbl_is_view and not db_is_system_schema %}
- {% if is_active %}
- <a href="tbl_tracking.php{{ url_query|raw }}">
- {{ get_icon('eye', 'Track view'|trans, true) }}
- </a>
- {% endif %}
- {% endif %}
- </div>
- {% if not tbl_is_view and not db_is_system_schema %}
- <form method="post" action="tbl_addfield.php" id="addColumns" name="addColumns">
- {{ get_hidden_inputs(db, table) }}
- {% if show_icons('ActionLinksMode') %}
- {{ get_image('b_insrow', 'Add column'|trans) }}
- {% endif %}
- {% set num_fields -%}
- <input type="number" name="num_fields" value="1" onfocus="this.select()" min="1" required>
- {%- endset %}
- {{ 'Add %s column(s)'|trans|format(num_fields)|raw }}
- <input type="hidden" name="field_where" value="after">
- {# I tried displaying the drop-down inside the label but with Firefox the drop-down was blinking #}
- <select name="after_field">
- <option value="first" data-pos="first">
- {% trans 'at beginning of table' %}
- </option>
- {% for one_column_name in columns_list %}
- <option value="{{ one_column_name }}"
- {{- loop.revindex0 == 0 ? ' selected="selected"' }}>
- {{ 'after %s'|trans|format(one_column_name) }}
- </option>
- {% endfor %}
- </select>
- <input class="btn btn-primary" type="submit" value="{% trans 'Go' %}">
- </form>
- {% endif %}
- {# Displays indexes #}
- {% if not tbl_is_view and not db_is_system_schema
- and 'ARCHIVE' != tbl_storage_engine %}
- {{ displayIndexesHtml|raw }}
- {% endif %}
- {# Display partition details #}
- {% if have_partitioning %}
- {# Detect partitioning #}
- {% if partition_names is not empty and partition_names[0] is not null %}
- {% set first_partition = partitions[0] %}
- {% set range_or_list = first_partition.getMethod() == 'RANGE'
- or first_partition.getMethod() == 'RANGE COLUMNS'
- or first_partition.getMethod() == 'LIST'
- or first_partition.getMethod() == 'LIST COLUMNS' %}
- {% set sub_partitions = first_partition.getSubPartitions() %}
- {% set has_sub_partitions = first_partition.hasSubPartitions() %}
- {% if has_sub_partitions %}
- {% set first_sub_partition = sub_partitions[0] %}
- {% endif %}
- {% set action_icons = {
- 'ANALYZE': get_icon('b_search', 'Analyze'|trans),
- 'CHECK': get_icon('eye', 'Check'|trans),
- 'OPTIMIZE': get_icon('normalize', 'Optimize'|trans),
- 'REBUILD': get_icon('s_tbl', 'Rebuild'|trans),
- 'REPAIR': get_icon('b_tblops', 'Repair'|trans),
- 'TRUNCATE': get_icon('b_empty', 'Truncate'|trans),
- } %}
- {% if range_or_list %}
- {% set action_icons = action_icons|merge({'DROP': get_icon('b_drop', 'Drop'|trans)}) %}
- {% endif %}
- {# open Slider Effect div #}
- {% include 'div_for_slider_effect.twig' with {
- 'id': 'partitions-2',
- 'message': 'Partitions'|trans,
- 'initial_sliders_state': default_sliders_state
- } only %}
- {% set remove_sql = 'ALTER TABLE ' ~ backquote(table) ~ ' REMOVE PARTITIONING' %}
- {% set remove_url = 'sql.php' ~ url_query ~ '&sql_query=' ~ remove_sql|url_encode %}
- {% include 'table/structure/display_partitions.twig' with {
- 'db': db,
- 'table': table,
- 'url_query': url_query,
- 'partitions': partitions,
- 'partition_method': first_partition.getMethod(),
- 'partition_expression': first_partition.getExpression(),
- 'has_description': first_partition.getDescription() is not empty,
- 'has_sub_partitions': has_sub_partitions,
- 'sub_partition_method': has_sub_partitions ? first_sub_partition.getMethod(),
- 'sub_partition_expression': has_sub_partitions ? first_sub_partition.getExpression(),
- 'action_icons': action_icons,
- 'range_or_list': range_or_list,
- 'remove_url': remove_url
- } only %}
- {% else %}
- {% include 'table/structure/display_partitions.twig' with {
- 'db': db,
- 'table': table
- } only %}
- {% endif %}
- {# For closing Slider effect div #}
- </div>
- {% endif %}
- {# Displays Space usage and row statistics #}
- {% if show_stats %}
- {{ table_stats|raw }}
- {% endif %}
- <div class="clearfloat"></div>
- {% endblock %}
|