Автоматическое увеличение десятичных чисел Mysql

Я создаю приложение, которое будет иметь одну таблицу клиентов с полем INT автоинкрементного идентификатора. Затем у меня есть Html-форма «кейс», в которой пользователю нужно будет выбрать клиента из раскрывающегося списка, а затем добавить некоторую информацию о «кейсе», которая войдет в другую таблицу. Это означает, что у клиента будет идентификатор 1,2,3 и так далее. И я хотел бы, чтобы дело добавляло одно десятичное число к идентификационному номеру клиента, выбранного из выпадающего списка. Итак, для Клиента номер два + 1: 2.1, 2.2 и так далее. Клиент №3, 3.1, 3.2 и т.д.

Каков наилучший способ добавить это дело в SQL? Я вижу, что если я выбрал Decimal для поля идентификатора случая, я получаю число 3,4 как 3,400, потому что я выбрал десятичное число 4,3 (MySQL) для тестирования. Мне нужно иметь такие десятичные знаки, потому что количество случаев может достигать сотен, я не могу это обрезать. Я борюсь с типом полей MySQL и с тем, как решить эту проблему. Буду признателен за руководство.

Единственное, что я могу придумать, это передать значение клиента, а затем сделать id + "." + 1 и сохраните его как десятичное число 1,1 (MySQL), будет ли это автоматически увеличиваться до 1,2 и так далее?


person ikiK    schedule 15.02.2020    source источник
comment
Я не вижу смысла так усложнять жизнь, но да, это то, что вы могли бы сделать на стороне сервера. получить счет и объединить 2   -  person JoshKisb    schedule 15.02.2020
comment
Мне нужно, чтобы это поле дела было уникальным и основывалось на идентификаторе клиента. И автоматически я не могу позволить людям вводить какую-либо из этих двух частей информации в одиночку. Если у вас есть другой способ, который проще, пожалуйста, сообщите.   -  person ikiK    schedule 15.02.2020


Ответы (2)


Механизм автоинкремента MySQL увеличивает только на целые числа. Извините, так это реализовано.

Лучший способ создать таблицу Case в MySQL:

CREATE TABLE Cases (
  case_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  client_id INT NOT NULL,
  ...other attributes of the case...
  FOREIGN KEY (client_id) REFERENCES Client (client_id)
);

У него будет один счетчик автоинкремента для таблицы, и все клиенты должны будут использовать этот номер. Это означает, что номера обращений не всегда будут последовательными для данного клиента и не будут начинаться с 1 для каждого клиента. Извините, так работает автоинкремент в MySQL.

Вопрос задавался много раз с некоторыми вариациями: "как я могу сделать автоинкремент, который перенумеровывает для каждой группы ?" Вы можете прочитать MAX(case_id) для данного клиента, для которого вам нужно вставить дело, а затем использовать max case_id + 1 в вашем INSERT. Другими словами, забудьте об использовании функции автоинкремента и вычислите идентификатор самостоятельно.

При этом вы должны заблокировать стол, чтобы избежать условий гонки; два одновременных пользователя могут вставлять одновременно и читать одно и то же значение для MAX (case_id) и пытаться вставить одно и то же значение.

Ваш план использования десятичных чисел приведет к проблемам.

  • Что, если однажды у вас будет клиент с более чем 999 делами? Вам придется переформатировать все идентификаторы обращений не только для клиента с 1000 обращений, но и для всех клиентов. Любые ссылки на идентификаторы дел, которые вы разослали в бумажных выписках и отчетах, станут недействительными.

  • Как бы вы выполнили SQL-запрос для поиска всех случаев для данного клиента? Если бы у вас был client_id в отдельном столбце, это был бы запрос, подобный SELECT ... FROM Case WHERE client_id = 3, но если вам нужно выполнить запрос, подобный ... WHERE case_id BETWEEN 3.000 AND 3.999, он менее понятен и его сложнее оптимизировать. Это также сложнее объяснить новому программисту, которого вы нанимаете для проекта. Если вы в конечном итоге расширите формат идентификатора до 4 цифр после запятой, вам придется переписать все эти SQL-запросы.

person Bill Karwin    schedule 15.02.2020
comment
Спасибо за ответ и объяснение, я не являюсь носителем английского языка, и у меня были проблемы с объяснением себя и поиском ответов здесь, а также я не знал о внешних ключах. Это очень хорошо написано, и это, очевидно, путь, если они хотят, чтобы это был автоматический процесс. В противном случае им придется делать это вручную. Таким образом, я позже просто напечатаю client_id + . + case_id, это будет номер ссылки. Спасибо за ваше время. Очень полезно. - person ikiK; 15.02.2020

Не делай этого. Это лучший совет, который я могу вам дать.

Вы пытаетесь использовать то, что в 80-х называлось Интеллектуальные коды.

Они вышли из моды по уважительной причине. Очень дорогой в разработке, неуправляемый, ограниченный радиус действия, что угодно. Держитесь подальше от них и вместо этого используйте обычные внешние ключи. Они дают вам всю необходимую гибкость при росте приложения.

person The Impaler    schedule 15.02.2020
comment
Спасибо за указание внешних ключей, я не знал о них. Я выбрал другой ответ только потому, что он был гораздо более объяснен. Спасибо за ваше время. - person ikiK; 15.02.2020