индексы и ограничения, не созданные в инструкции CREATE TABLE - PullRequest
0 голосов
/ 22 января 2019

Я использую MySQL / MariaDB и создаю таблицу сотрудников:

CREATE TABLE employees(
    id INT AUTO_INCREMENT,
    name VARCHAR(40) NOT NULL,
    description VARCHAR(50) DEFAULT 'No Description',
    random_assignment_id INT UNIQUE, 
    birth_date DATE, 
    salary DECIMAL(5,2),
    supervisor_id INT,
    branch_id INT NOT NULL,
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT random_assignment_check CHECK (LENGTH(random_assignment_id) = 5),
    INDEX(random_assignment_id, supervisor_id, branch_id),
    PRIMARY KEY(id)
)

Затем я подтверждаю, что таблица создана должным образом:

SHOW CREATE TABLE employees\G;
*************************** 1. row ***************************
       Table: employees
Create Table: CREATE TABLE `employees` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(40) NOT NULL,
  `description` varchar(50) DEFAULT 'No Description',
  `random_assignment_id` int(11) DEFAULT NULL,
  `birth_date` date DEFAULT NULL,
  `salary` decimal(5,2) DEFAULT NULL,
  `supervisor_id` int(11) DEFAULT NULL,
  `branch_id` int(11) NOT NULL,
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `random_assignment_id` (`random_assignment_id`),
  KEY `random_assignment_id_2` (`random_assignment_id`,`supervisor_id`,`branch_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.01 sec)

Я не вижуперечисленное ограничение random_assignment_check, и я ожидал, что оно будет индексировать random_assignment_id, supervisor_id и branch_id, но это не так:

 DESCRIBE employees;
+----------------------+--------------+------+-----+-------------------+----------------+
| Field                | Type         | Null | Key | Default           | Extra          |
+----------------------+--------------+------+-----+-------------------+----------------+
| id                   | int(11)      | NO   | PRI | NULL              | auto_increment |
| name                 | varchar(40)  | NO   |     | NULL              |                |
| description          | varchar(50)  | YES  |     | No Description    |                |
| random_assignment_id | int(11)      | YES  | UNI | NULL              |                |
| birth_date           | date         | YES  |     | NULL              |                |
| salary               | decimal(5,2) | YES  |     | NULL              |                |
| supervisor_id        | int(11)      | YES  |     | NULL              |                |
| branch_id            | int(11)      | NO   |     | NULL              |                |
| created_at           | timestamp    | NO   |     | CURRENT_TIMESTAMP |                |
| updated_at           | timestamp    | NO   |     | CURRENT_TIMESTAMP |                |
+----------------------+--------------+------+-----+-------------------+----------------+

Нет флагов MUL под ключом.

Обратите внимание, что я прочитал, что MariaDB теперь поддерживает ограничения;в соответствии с доморощенным, я использую:

brew info mariadb
mariadb: stable 10.3.12 (bottled)
Drop-in replacement for MySQL

Что я делаю не так?

1 Ответ

0 голосов
/ 22 января 2019

MySQL рассматривает KEY как синоним INDEX.Ваш индекс INDEX(random_assignment_id, supervisor_id, branch_id) стал KEY random_assignment_id_2 (random_assignment_id,supervisor_id,branch_id).Имя индекса было сгенерировано MySQL, но логически это тот же индекс.

Когда я протестировал ваш оператор CREATE TABLE, а затем использовал DESC для его отображения, я также не вижу индикаторов MUL.Это соответствует документации :

Если ключ равен MUL, столбец - это первый столбец неуникального индекса, в котором допустимы множественные вхождения данного значения в столбце.

Итак, в ваших выходных данных поле Key для random_assignment_id равно UNI, потому что это уникальный ключ, в дополнение к части многостолбцового ключа.

MySQLне поддерживает ограничения CHECK.Он анализирует их, а затем игнорирует их.Они не сохраняются вместе с вашей таблицей, и последующее использование SHOW CREATE TABLE не показывает их.

MariaDB внедрила ограничения CHECK в 10.2.1 в соответствии с https://mariadb.com/kb/en/library/constraint/#check-constraints (я не использую MariaDB, поэтому я буду доверять их документу.)

Из вашего вопроса не ясно, проверяли ли вы ограничение CHECK в MySQL Community Edition или MariaDB.Ограничение CHECK не будет сохранено в MySQL, а в MariaDB оно выглядит нормально для документа, но я никогда не проверял его.

Мы все должны перестать думать о MariaDB, заменяющей MySQL.Эти два продукта расходились в течение почти 10 лет, и больше нельзя считать их совместимыми.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...