這個問題與mysql的自動增量有關。我試圖達到的目標是根據客戶編號增加一個ID值。所以基本上我沒有任何順序插入數據集到表中。每次插入新客戶時,我都會要求id列增加,但當然要保留與客戶有關的每一行,請參閱下表。有沒有什麼辦法通過SQL來實現?我用多個主鍵嘗試了我的運氣,並研究了分配問題,但無法自己弄清楚。基於組的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 | info |客戶| + ---- + ------ + -------------- + ---------- + | 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
語句包含在回退的事務中,則該插入生成的值將被跳過。另外,如果使用ON DUPLICATE KEYS UPDATE
的INSERT
語句嘗試插入許多行,但其中一些行已經存在於表中,則會跳過爲重複鍵生成的ID
。
我想強調的一點是,沒有一點試圖讓使用AUTO_INCREMENT
列,它甚至無法連續值。
回到你的問題,如果列ID
是表的PK
,其類型爲INT AUTO_INCREMENT
那麼MySQL保證不會有有在ID
列的值相同的兩行,這也滿足你的需要對於customer
中具有相同值的所有行,ID
具有不同的值。
關於自動遞增列的非連續性質,非常好(也很重要)。 – wally
您可以使用存儲過程來程序化地執行此操作,我不會詳細說明(除非請求),因爲它不是一個簡單的查詢(正如您所要求的那樣)。
哈克的解決辦法是批量插入到一個新加入的表:
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. PHP MySQL數據庫自動增量基於行數
- 5. 自動增量列的MySQL
- 6. 基於mysql中的select插入期間增加非自動增量字段
- 7. MySQL:自動增量減1?
- 8. MYSQL自動增量範圍
- 9. MySQL自動增量白天?
- 10. MySQL觸發自動增量
- 11. 自動增量問題mysql
- 12. Mysql自動增量幫助
- 13. Mysql自動增量增加2和1?
- 14. MySQL組增量
- 15. 自動增量數組java
- 16. JPA:基於自動遞增的ID
- 17. MySQL:無法更新基於自動增量密鑰的單個記錄
- 18. MySQL基於其他兩列的值自動增加ID
- 19. Mysql自動增量重置自己? xamp
- 20. SQLite的自動增量基於另一個列的值
- 21. MySQL的自動增量消失
- 22. MySQL的自動增量問題
- 23. 重置mysql中的自動增量值
- 24. MySQL的自動增量綁定屬性
- 25. mysql中的多個自動增量
- 26. 更新時的MySQL自動增量
- 27. MySQL的:將數據和自動增量
- 28. 在MySQL中的自動增量
- 29. MySQL的獲得不帶自動增量
- 30. 基於外鍵的Django模型自動增量主鍵
這是什麼新列的目的是什麼?它看起來是多餘的 - 因爲你已經有了一個客戶ID列。 – wally
我需要它來導入我們的ERP系統,這需要我描述它。我只是想知道是否可以通過sql直接獲取行爲,否則我會在導出後在Excel中編輯我的表。 –
啊哈。這就說得通了!就個人而言,我會使用一個存儲過程,或者創建一個臨時表(或者只是輸出結果集,如果系統可以支持的話),按程序執行。我會使用連接表發佈一個快速而骯髒的答案。 – wally