2016-12-27 55 views
0

這個問題與mysql的自動增量有關。我試圖達到的目標是根據客戶編號增加一個ID值。所以基本上我沒有任何順序插入數據集到表中。每次插入新客戶時,我都會要求id列增加,但當然要保留與客戶有關的每一行,請參閱下表。有沒有什麼辦法通過SQL來實現?我用多個主鍵嘗試了我的運氣,並研究了分配問題,但無法自己弄清楚。基於組的MySQL自動增量

test table

+0

這是什麼新列的目的是什麼?它看起來是多餘的 - 因爲你已經有了一個客戶ID列。 – wally

+0

我需要它來導入我們的ERP系統,這需要我描述它。我只是想知道是否可以通過sql直接獲取行爲,否則我會在導出後在Excel中編輯我的表。 –

+0

啊哈。這就說得通了!就個人而言,我會使用一個存儲過程,或者創建一個臨時表(或者只是輸出結果集,如果系統可以支持的話),按程序執行。我會使用連接表發佈一個快速而骯髒的答案。 – 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 | info |客戶| + ---- + ------ + -------------- + ---------- + | 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語句包含在回退的事務中,則該插入生成的值將被跳過。另外,如果使用ON DUPLICATE KEYS UPDATEINSERT語句嘗試插入許多行,但其中一些行已經存在於表中,則會跳過爲重複鍵生成的ID

我想強調的一點是,沒有一點試圖讓使用AUTO_INCREMENT列,它甚至無法連續值。

回到你的問題,如果列ID是表的PK,其類型爲INT AUTO_INCREMENT那麼MySQL保證不會有有在ID列的值相同的兩行,這也滿足你的需要對於customer中具有相同值的所有行,ID具有不同的值。

+0

關於自動遞增列的非連續性質,非常好(也很重要)。 – wally

0

您可以使用存儲過程來程序化地執行此操作,我不會詳細說明(除非請求),因爲它不是一個簡單的查詢(正如您所要求的那樣)。

哈克的解決辦法是批量插入到一個新加入的表:

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

在閱讀所有評論到目前爲止,我很欣賞,我相信當我簡單地使用自定義解決方案改變收集所有數據後的紀念碑,而不是收集它時,我會快得多。 –