2016-12-27 5 views
0

Проблема связана с автоинкрементацией с помощью mysql. То, что я пытаюсь достичь, - увеличить значение идентификатора на основе номера клиента. Поэтому в основном я вставляю наборы данных без какого-либо заказа в таблицу. Каждый раз, когда вставлен новый клиент, я бы хотел, чтобы столбец идентификатора увеличивался, но, конечно, сохранялся для каждой строки, связанной с клиентом, см. Таблицу ниже. Есть ли способ достичь этого через sql? Я попробовал удачу с несколькими первичными ключами, а также посмотрел на partioning, но не смог разобраться в себе.Автоинкремент MySQL на основе группы

test table

+0

Какова цель этого нового столбца? Он кажется лишним - поскольку у вас уже есть столбец идентификатора клиента. – wally

+0

Мне нужен он для импорта в нашу ERP-систему, которая требует ее, как я ее описал. Мне просто интересно, можно ли получить поведение напрямую через sql, иначе я собираюсь изменить свою таблицу в excel после того, как я ее экспортировал. –

+0

Aha. В этом есть смысл! Лично я использую хранимую процедуру, создавая временную таблицу (или просто выводя набор результатов, если система может это поддерживать), делая это процедурно. Я отправлю быстрый и грязный ответ, используя таблицу соединений. – wally

ответ

1

вы можете использовать запрос следующим образом:

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> 
+0

Благодарим вас за ответ, но это не совсем то, что я ищу. Мне нужен такой вывод: –

+0

mysql> SELECT * from autoinc; + ---- + ------ + -------------- + ---------- + | id | cid | информация | клиент | + ---- + ------ + -------------- + ---------- + | 1 | 1 | Клиент 1 | 12345 | | 2 | 1 | Клиент 1 | 12345 | | 3 | 2 | B Заказчик 2 | 9876 | | 4 | 1 | Клиент 1 | 12345 | + ---- + ------ + -------------- + ---------- + –

+0

Это ужасная идея. – Strawberry

0

То, что вы, вероятно, нужно иметь разные значения для ID для каждого клиента. Самый простой способ добиться этого - использовать столбец AUTO_INCREMENT как PK вашей таблицы.

Это деталь реализации, которая для последовательно вставленных строк столбец AUTO_INCREMENT имеет последовательные значения. И предыдущее утверждение не совсем верно. Это просто случается несколько раз, это не гарантируется. Если оператор INSERT заключен в транзакцию, откат которой возвращается, значение, генерируемое этой вставкой, пропускается. Кроме того, если операторы INSERT, которые используют ON DUPLICATE KEYS UPDATE, пытаются вставить много строк, но некоторые из них уже существуют в таблице, тогда генерируются ID, сгенерированные для дубликатов ключей.

То, что я хочу подчеркнуть, вне что нет смысла пытаться получить последовательные значения, используя AUTO_INCREMENT столбец и это даже не представляется возможным.

Вернуться к вашей проблеме, если столбец ID является PK таблицы и ее тип INT AUTO_INCREMENT то MySQL гарантирует, что не будет две строки, имеющие одинаковое значение в столбце ID и это также удовлетворяет ваши потребности в имеют разные значения для ID для всех строк с тем же значением в customer.

+0

Очень хорошая (и важная) точка, касающаяся непоследовательной природы автоинкрементных столбцов. – wally

0

Вы можете сделать это с помощью хранимой процедуры, которую я не буду разрабатывать (если не запрошено), поскольку это не простой запрос (как вы просите).

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

+0

После прочтения всех комментариев до сих пор, которые я ценю, я считаю, что я буду намного быстрее, когда я просто использую настраиваемое решение, изменяющее цветовую рассылку ПОСЛЕ собирания всех данных, а не сбор данных. –

Смежные вопросы