Можете ли вы создать значение первичного ключа, которое использует данные из других столбцов?

#mysql #sql

Вопрос:

Я новичок в MySQL и базах данных. Моя база данных-это управление кинотеатром. В одной из моих таблиц, SALE, есть PK sale_id. Значение, сохраненное в sale_id, — это VARCHAR(19), который представляет собой комбинацию столбцов customer_id(FK-VARCHAR(7)) и sale_datetime(ДАТА-ВРЕМЯ). Можно ли создать значение первичного ключа в MySQL workbench, основанное на других столбцах таблицы?

Таблица ПРОДАЖ создается как таковая:

 CREATE TABLE `sale` (
  `sale_id` varchar(19) NOT NULL,
  `customer_id` varchar(7) NOT NULL,
  `sale_datetime` datetime NOT NULL,
  `payment_type` varchar(4) NOT NULL,
  `ticket_quantity` int NOT NULL,
  `sale_total` decimal(5,2) NOT NULL,
  PRIMARY KEY (`sale_id`),
  KEY `fk_sale_customer_id_idx` (`customer_id`),
  CONSTRAINT `fk_sale_customer_id` FOREIGN KEY (`customer_id`) REFERENCES `customer`(`customer_id`)) 
 

Есть ли какое-то «ограничение», которое я могу установить, которое автоматически создаст идентификатор sale_id на основе идентификатора пользователя и времени sale_datetime при добавлении данных в эту таблицу? Например:
Если я добавляю строку в эту таблицу, где мой идентификатор пользователя 1111111, а дата продажи 2021-08-13 12:00:00, идентификатор продажи автоматически будет установлен на 1111111202108131200?

Комментарии:

1. нет, обобщенный столбец не может быть первичным ключом, используйте триггер вставки для его создания см. dbfiddle.uk/…

Ответ №1:

Наличие первичного ключа в виде VARCHAR, как у вас, не рекомендуется для механизма хранения MySQL: InnoDB.

Для получения дополнительной информации проверьте это: https://lefred.be/content/mysql-invisible-column-part-ii/

Я бы предложил иметь автоматическое увеличение PK в качестве идентификатора sale_id. В чем была бы выгода от этого не инкрементного ПК ? Я бы также предложил приложению сгенерировать это поле с указанием клиента и анализируемой даты, и вы также могли бы его проиндексировать (уникально). Это поле, конечно, тоже может быть сгенерировано триггером, если вы предпочитаете, см. https://dev.mysql.com/doc/refman/8.0/en/trigger-syntax.html.