簡體   English   中英

在同一表的表上插入行

[英]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值,即12

使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM