仅根据非唯一参数更新查询中的一行?

时间:2019-02-25 13:27:06

标签: mysql sql

我有一个包含重复键的大表,我试图连接到具有唯一键的较小表。我知道,事实并非如此。我只希望来自较小表的匹配项可以更新较大表中的一行,然后移至下一个较小表行以进行下一次更新。我之所以需要这样,是因为我试图在较大的表中创建唯一的ID,因为每一行代表一个具有真实世界对象自身层次结构的真实世界产品。

例如,

bigtable
barcodeSnippet        t_stamp       workId       parentCase    newId
aaaa                  time1         1            1             NULL
aaaa                  time1         1            1             NULL
aaaa                  time1         1            1             NULL

我的小桌子上可能有这个

smalltable
id   barcodeSnippet      t_stamp      workId      parentCase
1    aaaa                time1        1           1
2    aaaa                time1        1           1

我想要在大表中的最终结果是

bigtable
barcodeSnippet        t_stamp       workId       parentCase    newId
aaaa                  time1         1            1             1
aaaa                  time1         1            1             2
aaaa                  time1         1            1             NULL

我每行只进行一次迁移,由于在大表中有3行,而在小表中有2个匹配项,因此剩下NULL。

我当前的查询

UPDATE bigtable as bt
JOIN smallTable as st ON (bt.barcodeSnippet = b.barcodeSnippet AND 
bt.parentCase= st.parentCase and bt.t_stamp = st.t_stamp and bt.workId = 
st.workId)
SET bt.bottlesId = st.id;

不起作用,我看不到在UPDATE的MySQL中可以使用LIMIT。我在MS SQL中看到了其他答案,可以在其中使用TOP 1,也许在newId为NULL的地方,但是我还是在这里使用MySQL。

我认为我可能需要使用“存储过程/游标”方法,但是即使如此,我似乎也不得不运行更新语句,然后回到第1格。

有什么想法吗?使用MySQL 5.6。

编辑:认为我有一个不错的解决方案。我刚刚更新了查询,因此确实有重复项。但是,现在我添加了一个行号列。我计划将表本身连接起来,如果行号<行号,则对其进行更新,因此我保留了最上面的ID,并且可以将其他ID设置为null,这是合适的。

类似这样

UPDATE bigtable tb
JOIN bigtable tb2 ON tb.newId = tb2.newId
SET tb.newId = NULL
WHERE tb.rowNumber < tb2.rowNumber;

1 个答案:

答案 0 :(得分:0)

您将auto_incremented id列与超全局$_GET一起使用:

1.php <?php $var = $row["id"]; ?> <a href="2.php?id=<?php echo $var; ?>">Something</a>

然后在您的2.php中

<?php $id = $_GET["id"]; $sql = "SELECT * FROM table WHERE id='$id';"; 当然,您需要使用准备好的语句