This:
KEY `location_sh` (`dep_name`,`cat_name`,`loc_name`)
.. определяет индекс покрытия, называемый "location_sh".Я указал «охватывающий индекс», потому что объявление индекса включает в себя более одного столбца.
KEY `owner_sh` (`owner`)
... не использует более одного столбца, поэтому это просто index .KEY
- это специфический для MySQL синтаксис для индексов - хотя в настоящее время он не охватывается ANSI, каждая база данных реализует индексы и использует аналогичную терминологию (по моде).
Остальные объявления CONSTRAINT:
CONSTRAINT `location_sh` FOREIGN KEY (`dep_name`, `cat_name`, `loc_name`)
REFERENCES `locations` (`dep_name`, `cat_name`, `loc_name`)
ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `owner_sh` FOREIGN KEY (`owner`) REFERENCES `users` (`username`)
ON DELETE SET NULL ON UPDATE CASCADE
... ограничения внешнего ключа .Они используются для обеспечения ссылочной целостности - определенные столбцы могут иметь только те значения, которые уже существуют в столбцах таблицы, указанных в части REFERENCES
оператора.
Относительно ON DELETE ...
-Документация гласит:
Действие InnoDB, выполняемое для любой операции UPDATE или DELETE, которая пытается обновить или удалить значение ключа-кандидата в родительской таблице, имеющей несколько совпадающих строк в дочерней таблице, зависит от ссылочнойдействие, указанное с использованием подпунктов ON UPDATE и ON DELETE предложения FOREIGN KEY.Когда пользователь пытается удалить или обновить строку из родительской таблицы, и в дочерней таблице есть одна или несколько совпадающих строк, InnoDB поддерживает пять опций, касающихся действия, которое необходимо предпринять.Если ON DELETE или ON UPDATE не указаны, по умолчанию используется действие RESTRICT.
Какие изменения вы должны внести?
Для нас нет контекста, чтобы сказать, что правильно или неправильно, за исключением синтаксиса (который кажется правильным).Все зависит от ваших данных и бизнес-правил для этих данных.