我的数据库中有一个表,其中有以下列:[id,userId,locationId,created,update],我想要做的是将所有用户从一个位置插入到其他位置,除了以下用户存在于第二个位置(如果这个新条目可以在创建和更新的列上具有新插入的日期,那就太棒了)。我的意思是,如果我有这张 table :
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。
然后使用 insertignore ... 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 是您需要在查询中提供的参数。
关于mysql - 在同一个表的表上插入行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37859005/