programing

CREATE TABLE 문에 생성되지 않은 인덱스 및 제약 조건

nicegoodjob 2023. 2. 5. 09:46
반응형

CREATE TABLE 문에 생성되지 않은 인덱스 및 제약 조건

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는 현재 구속조건을 지원한다고 읽었습니다. homebrew에 따르면 다음을 사용하고 있습니다.

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

내가 뭘 잘못하고 있지?

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_idUNI여러 열 키와 더불어 고유한 키이기 때문입니다.

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는 Doc별로 괜찮은 것 같지만 테스트한 적은 없습니다.

MySQL을 대신할 MariaDB는 더 이상 생각하지 말아야 합니다.두 제품은 10년 가까이 차이가 나 더 이상 호환성이 없다고 가정할 수 없다.

언급URL : https://stackoverflow.com/questions/54312010/indexes-and-constraints-not-created-in-create-table-statement

반응형