Автоматическое увеличение Mysql проблемы десятичного числа - PullRequest
1 голос
/ 15 февраля 2020

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

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

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

Ответы [ 2 ]

1 голос
/ 15 февраля 2020

Механизм автоинкрементации 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 запросов.

1 голос
/ 15 февраля 2020

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

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

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

...