PRIMARY KEY(col1, col2, col4), UNIQUE KEY(col2, col1))
PARTITION BY HASH(col1 + YEAR(col2)) PARTITIONS 4;
Если таблица не имеет никакого уникального или первичного ключа, то это ограничение не применяется, и Вы можете использовать любой столбец или столбцы в выражении выделения разделов, пока тип столбца совместим с типом выделения разделов.
По той же самой причине Вы не можете позже добавлять уникальный ключ к разбитой на разделы таблице, если этот ключ не включает все столбцы, используемые выражением выделения разделов таблицы. Рассмотрите разбитую на разделы таблицу, определенную так, как показано здесь:
CREATE TABLE t_no_pk (c1 INT, c2 INT)
PARTITION BY RANGE(c1) (PARTITION p0 VALUES LESS THAN (10),
PARTITION p1 VALUES LESS THAN (20),
PARTITION p2 VALUES LESS THAN (30),
PARTITION p3 VALUES LESS THAN (40));
Возможно добавить первичный ключ к t_no_pk, используя любую из этих инструкций ALTER TABLE:
# possible PK
ALTER TABLE t_no_pk ADD PRIMARY KEY(c1);
# also a possible PK
ALTER TABLE t_no_pk ADD PRIMARY KEY(c1, c2);
Однако, следующие операторы свалятся потому, что c1 представляет собой часть ключа выделения разделов, но не часть предложенного первичного ключа:
# fails with ERROR 1482
ALTER TABLE t_no_pk ADD PRIMARY KEY(c2);
С тех пор как t_no_pk имеет только c1 в
выражении выделения разделов, попытка добавления уникального ключа на c2 всегда провалится. Однако, Вы можете добавлять уникальный ключ, который использует c1 и c2.
Эти правила также относятся к существующим не разбитым на разделы таблицам, в которых Вы желаете выделить разделы используя ALTER TABLE … PARTITION BY. Рассмотрите таблицу np_pk:
CREATE TABLE np_pk (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(50),
added DATE, PRIMARY KEY (id)
);
Следующяя инструкция ALTER TABLE потерпит неудачу с ошибкой, потому что столбец added не является частью любого
уникального ключа в таблице:
ALTER TABLE np_pk PARTITION BY HASH(TO_DAYS(added)) PARTITIONS 4;
Эта инструкция, однако, была бы полностью допустима:
ALTER TABLE np_pk PARTITION BY HASH(id) PARTITIONS 4;
В случае np_pk единственный столбец, который может использоваться как часть выражения выделения разделов, id. Если Вы желаете выделить разделы этой таблицы, использующие любой другой столбец или столбцы в выражении выделения разделов, Вы должны сначала изменить таблицу, добавляя желательный столбец или столбцы на первичный ключ или удаляя первичный ключ в целом.
Подразделы ограничены выделением разделов HASH или KEY. Разделы HASH и KEY не могут быть
подразбиты на разделы.
Глава 4. Пространственные расширения
MySQL поддерживает пространственные расширения, чтобы позволить хранение и анализ географических свойств. Эти свойства доступны для таблиц типов MyISAM, InnoDB, NDB и ARCHIVE. Однако, тип ARCHIVE не поддерживает индексацию, так что пространственные столбцы в столбцах ARCHIVE не могут быть индексированы. MySQL Cluster также не поддерживает индексацию пространственных столбцов.
Хотя пространственные расширения обеспечиваются в таблицах InnoDB, использование пространственных индексов может вызывать аварийный отказ (Глюк #15860).
Эта глава покрывает следующие темы:
Основание этих пространственных расширений в модели геометрии OpenGIS.
Форматы для представления пространственных данных.
Как использовать пространственные данные в MySQL.
Использование индексации для пространственных данных.
Отличия MySQL от спецификации OpenGIS.
Дополнительные ресурсы
Open Geospatial Consortium издает OpenGIS Simple Features Specifications For SQL, документ, который предлагает несколько концептуальных способов для распространения SQL RDBMS, чтобы поддерживать пространственные данные. Эта спецификация доступна на http://www.opengis.org/docs/99-049.pdf.
Если Вы имеете вопросы или интересы относительно использования пространственных расширений MySQL, Вы можете обсуждать их на форуме GIS: http://forums.mysql.com/list.php?23.
4.1. Введение в пространственную поддержку MySQL
MySQL осуществляет пространственные расширения по спецификации Open Geospatial Consortium (OGC). Это международный консорциум более, чем 250 компаний, агентств и университетов, участвующих в