Проблема связана с автоинкрементацией с помощью mysql. То, что я пытаюсь достичь, - увеличить значение идентификатора на основе номера клиента. Поэтому в основном я вставляю наборы данных без какого-либо заказа в таблицу. Каждый раз, когда вставлен новый клиент, я бы хотел, чтобы столбец идентификатора увеличивался, но, конечно, сохранялся для каждой строки, связанной с клиентом, см. Таблицу ниже. Есть ли способ достичь этого через sql? Я попробовал удачу с несколькими первичными ключами, а также посмотрел на partioning, но не смог разобраться в себе.Автоинкремент MySQL на основе группы
ответ
вы можете использовать запрос следующим образом:
INSERT INTO autoinc (cid,info,customer)
SELECT
COALESCE(max(cid),0) +1
, 'A Customer 1'
, 12345
FROM autoinc
WHERE customer = 12345;
образец
mysql> SELECT * from autoinc;
Empty set (0,00 sec)
mysql> INSERT INTO autoinc (cid,info,customer)
-> SELECT
-> COALESCE(max(cid),0) +1
-> , 'A Customer 1'
-> , 12345
-> FROM autoinc
-> WHERE customer = 12345;
Query OK, 1 row affected (0,00 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> SELECT * from autoinc;
+----+------+--------------+----------+
| id | cid | info | customer |
+----+------+--------------+----------+
| 1 | 1 | A Customer 1 | 12345 |
+----+------+--------------+----------+
1 row in set (0,00 sec)
mysql> INSERT INTO autoinc (cid,info,customer)
-> SELECT
-> COALESCE(max(cid),0) +1
-> , 'A Customer 1'
-> , 12345
-> FROM autoinc
-> WHERE customer = 12345;
Query OK, 1 row affected (0,00 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> SELECT * from autoinc;
+----+------+--------------+----------+
| id | cid | info | customer |
+----+------+--------------+----------+
| 1 | 1 | A Customer 1 | 12345 |
| 2 | 2 | A Customer 1 | 12345 |
+----+------+--------------+----------+
2 rows in set (0,00 sec)
mysql> INSERT INTO autoinc (cid,info,customer)
-> SELECT
-> COALESCE(max(cid),0) +1
-> , 'B Customer 2'
-> , 9876
-> FROM autoinc
-> WHERE customer = 9876;
Query OK, 1 row affected (0,00 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> SELECT * from autoinc;
+----+------+--------------+----------+
| id | cid | info | customer |
+----+------+--------------+----------+
| 1 | 1 | A Customer 1 | 12345 |
| 2 | 2 | A Customer 1 | 12345 |
| 3 | 1 | B Customer 2 | 9876 |
+----+------+--------------+----------+
3 rows in set (0,00 sec)
mysql> INSERT INTO autoinc (cid,info,customer)
-> SELECT
-> COALESCE(max(cid),0) +1
-> , 'A Customer 1'
-> , 12345
-> FROM autoinc
-> WHERE customer = 12345;
Query OK, 1 row affected (0,00 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> SELECT * from autoinc;
+----+------+--------------+----------+
| id | cid | info | customer |
+----+------+--------------+----------+
| 1 | 1 | A Customer 1 | 12345 |
| 2 | 2 | A Customer 1 | 12345 |
| 3 | 1 | B Customer 2 | 9876 |
| 4 | 3 | A Customer 1 | 12345 |
+----+------+--------------+----------+
4 rows in set (0,00 sec)
mysql>
Благодарим вас за ответ, но это не совсем то, что я ищу. Мне нужен такой вывод: –
mysql> SELECT * from autoinc; + ---- + ------ + -------------- + ---------- + | id | cid | информация | клиент | + ---- + ------ + -------------- + ---------- + | 1 | 1 | Клиент 1 | 12345 | | 2 | 1 | Клиент 1 | 12345 | | 3 | 2 | B Заказчик 2 | 9876 | | 4 | 1 | Клиент 1 | 12345 | + ---- + ------ + -------------- + ---------- + –
Это ужасная идея. – Strawberry
То, что вы, вероятно, нужно иметь разные значения для ID
для каждого клиента. Самый простой способ добиться этого - использовать столбец AUTO_INCREMENT
как PK
вашей таблицы.
Это деталь реализации, которая для последовательно вставленных строк столбец AUTO_INCREMENT
имеет последовательные значения. И предыдущее утверждение не совсем верно. Это просто случается несколько раз, это не гарантируется. Если оператор INSERT
заключен в транзакцию, откат которой возвращается, значение, генерируемое этой вставкой, пропускается. Кроме того, если операторы INSERT
, которые используют ON DUPLICATE KEYS UPDATE
, пытаются вставить много строк, но некоторые из них уже существуют в таблице, тогда генерируются ID
, сгенерированные для дубликатов ключей.
То, что я хочу подчеркнуть, вне что нет смысла пытаться получить последовательные значения, используя AUTO_INCREMENT
столбец и это даже не представляется возможным.
Вернуться к вашей проблеме, если столбец ID
является PK
таблицы и ее тип INT AUTO_INCREMENT
то MySQL гарантирует, что не будет две строки, имеющие одинаковое значение в столбце ID
и это также удовлетворяет ваши потребности в имеют разные значения для ID
для всех строк с тем же значением в customer
.
Очень хорошая (и важная) точка, касающаяся непоследовательной природы автоинкрементных столбцов. – wally
Вы можете сделать это с помощью хранимой процедуры, которую я не буду разрабатывать (если не запрошено), поскольку это не простой запрос (как вы просите).
Hacky решение будет массовой вставки в новую таблицу соединения:
CREATE TABLE auto_inc_customer_id (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
customer_id INT UNSIGNED NOT NULL, -- Could/should add a FK constraint
PRIMARY KEY (id)
) ENGINE=innodb;
INSERT INTO auto_inc_customer_id SELECT NULL, DISTINCT(Customer) FROM YourExistingTable;
См: http://dev.mysql.com/doc/refman/5.7/en/ansi-diff-select-into-table.html
После прочтения всех комментариев до сих пор, которые я ценю, я считаю, что я буду намного быстрее, когда я просто использую настраиваемое решение, изменяющее цветовую рассылку ПОСЛЕ собирания всех данных, а не сбор данных. –
- 1. MySQL группы на основе другого столбца
- 2. записей MySQL группы на основе значения столбца
- 3. Автоинкремент на основе ряда других колонок
- 4. MySQL workbench 6.2 автоинкремент
- 5. динамически меняет автоинкремент в mysql
- 6. mysql автоинкремент whats правильный тип?
- 7. mysql leftjoin max автоинкремент id?
- 8. Как хэш-автоинкремент в mysql
- 9. MySQL вставки автоинкремент мул ключ
- 10. пользовательский автоинкремент в таблице Mysql
- 11. Предотвратить MySQL автоинкремент прыжки последовательность
- 12. разрешения на основе группы cakephp
- 13. Объединение столбцов на основе группы
- 14. выберите предыдущую строку на основе группы в MYSQL
- 15. Аутентификация/авторизация пользователя на основе группы с apache и mysql
- 16. MySQL Дело Заявление группы по столбцам на основе подсчета()
- 17. Приращение одного значения на основе значений столбца и группы mysql
- 18. Удаление дубликатов на основе группы К - SQL
- 19. SQL-инъекция на автоинкремент
- 20. Автоматический прирост для группы полей в MySQL
- 21. Композитный автоинкремент InnoDB на основе двух столбцов (префикс и дата)
- 22. Как сделать автоинкремент на основе последнего значения из другой таблицы?
- 23. Автоинкремент не написан на объект
- 24. Почему автоинкремент MySQL увеличивается при неудачных вставках?
- 25. MySQL - генерация уникального идентификатора, такого как автоинкремент
- 26. группы базовый запрос на MySQL
- 27. Mysql GROUP_CONCAT на группы списков
- 28. Запрос MySQL на результаты группы
- 29. Пользовательский автоинкремент Mysql для исправления случайных идентификаторов
- 30. mysql автоинкремент и rails4: sql structure.sql
Какова цель этого нового столбца? Он кажется лишним - поскольку у вас уже есть столбец идентификатора клиента. – wally
Мне нужен он для импорта в нашу ERP-систему, которая требует ее, как я ее описал. Мне просто интересно, можно ли получить поведение напрямую через sql, иначе я собираюсь изменить свою таблицу в excel после того, как я ее экспортировал. –
Aha. В этом есть смысл! Лично я использую хранимую процедуру, создавая временную таблицу (или просто выводя набор результатов, если система может это поддерживать), делая это процедурно. Я отправлю быстрый и грязный ответ, используя таблицу соединений. – wally