我正在使用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
我在做什么错了?
答案 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年的差异,不能再假定它们是兼容的。