在CREATE TABLE语句中未创建的索引和约束

时间:2019-01-22 15:56:01

标签: mysql sql mariadb

我正在使用MySQL / MariaDB,并创建了一个employee表:

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 :(得分:1)

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指示符。这适合documentation

  

如果Key为MUL,则该列是非唯一索引的第一列,该列中允许多次出现给定值。

因此,在您的输出中,random_assignment_id的键字段是UNI,因为它是唯一的键,除了多列键的一部分。

MySQL不支持CHECK约束。它解析它们,然后忽略它们。它们没有存储在您的表中,随后使用SHOW CREATE TABLE不会显示它们。

MariaDB已根据https://mariadb.com/kb/en/library/constraint/#check-constraints在10.2.1中实现了CHECK约束(我不使用MariaDB,所以我会相信他们的文档)。

目前还不清楚您是否在MySQL Community Edition或MariaDB上测试了CHECK约束。 CHECK约束将不会保存在MySQL上,在MariaDB上,每个文档似乎都可以,但是我从未测试过。

我们所有人都应该停止考虑MariaDB是MySQL的直接替代品。两种产品已经有将近10年的差异,不能再假定它们是兼容的。