![](/img/trans.png)
[英]Insert multiple rows from one column in a table to the same column from the same table
[英]Insert rows on table from the same table
我的數據庫中有一個表,其中包含以下列:[id,userId,locationId,創建,更新],我想要做的是將所有用戶從一個位置插入到其他位置,但存在於第二個位置(如果此新條目可以在創建和更新的列上包含此新插入的日期,那將是很棒的)。 我的意思是,如果我有這張桌子:
id | userId | location | created | updated
1 | 1 | 1 | 1234567 | 1234567
2 | 2 | 1 | 9876543 | 9876543
3 | 1 | 2 | 5555555 | 6666666
假設實際時間為9999999,則在執行插入操作后,結果必須為:
id | userId | location | created | updated
1 | 1 | 1 | 1234567 | 1234567
2 | 2 | 1 | 9876543 | 9876543
3 | 1 | 2 | 5555555 | 6666666
4 | 2 | 2 | 9999999 | 9999999
任何解決方案? 謝謝。
編輯(考慮更多情況)
我沒有考慮更多的信息。 在該示例中,僅沿一個方向傳輸數據:信息從位置1到位置2。主要是因為位置2上沒有用戶,而位置1沒有。
完美的解決方案是,轉移沿兩個方向進行,甚至使用兩個以上的位置,如下所示:
id | userId | location | created | updated
1 | 1 | 1 | 1234567 | 1234567
2 | 2 | 1 | 9876543 | 9876543
3 | 1 | 2 | 5555555 | 6666666
4 | 3 | 2 | 1829384 | 0192837
5 | 4 | 3 | 8888833 | 9991828
6 | 5 | 4 | 1111111 | 2222222
假設實際時間是9999999,並且我只想在插入操作之后涉及位置1、2和3,結果必須是這樣的:
id | userId | location | created | updated
1 | 1 | 1 | 1234567 | 1234567
2 | 2 | 1 | 9876543 | 9876543
3 | 1 | 2 | 5555555 | 6666666
4 | 3 | 2 | 1829384 | 0192837
5 | 4 | 3 | 8888833 | 9991828
6 | 5 | 4 | 1111111 | 2222222
/*news*/
7 | 3 | 1 | 9999999 | 9999999
8 | 4 | 1 | 9999999 | 9999999
9 | 2 | 2 | 9999999 | 9999999
10 | 4 | 2 | 9999999 | 9999999
11 | 1 | 3 | 9999999 | 9999999
12 | 2 | 3 | 9999999 | 9999999
13 | 3 | 3 | 9999999 | 9999999
位置1、2和3共享他們的用戶,但不共享位置4。這可能是最好的解決方案,但我會滿足於這些位置與其他位置一個一共享他們的數據...並且我可以通過編程使環。
我要在用戶ID-位置字段上創建多列唯一索引。 這樣可以防止插入相同位置的重復用戶ID。
然后使用insert ignore ... select ...
查詢從其他位置插入用戶。 忽略意味着MySQL將忽略重復的鍵沖突錯誤,並將繼續插入有效用戶:
INSERT IGNORE INTO yourtable (userId, location, created, update)
SELECT userId, new_location, now(), now()
FROM youtable as t2
WHERE t2.location=current_location
new_location和current_location是您需要在查詢中提供的參數。
您可以使用如下查詢:
INSERT INTO mytable (`userId`, `location`, `created`, `updated`)
SELECT userId, IF(location = 1, 2, 1), NOW(), NOW()
FROM mytable
GROUP BY userId
HAVING COUNT(DISTINCT location) = 1;
該查詢假定id
字段是自動遞增的,因此可以從INSERT
操作中排除。 還假設只有兩個可用的location
值,即1
和2
。
使用INSERT ....SELECT Statement
對於創建和更新日期,您可以使用MySQL UNIX_TIMESTAMP()
函數
像這樣
INSERT INTO LOCATION2 (id, userId, locationId, created, update)
SELECT id, userId, locationId, UNIX_TIMESTAMP(), UNIX_TIMESTAMP() FROM LOCATION1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.