2011-08-31 30 views
1

我有一个MySQL查询,看起来像这样:如何在插入一行时,如果它在更新多行时尚不存在?

UPDATE `Table` SET `Column` = 
    CASE 
     WHEN `Option Id` = '1' THEN 'Apple' 
     WHEN `Option Id` = '2' THEN 'Banana' 
     WHEN `Option Id` = '3' THEN 'Q-Tip' 
    END 

的我的表目前看起来是这样的:

Option Id | Column 
     1 |  x 
     2 |  x 

我想它导致:

Option Id | Column 
     1 | Apple 
     2 | Banana 
     3 | Q-Tip 

但它不会插入Q-Tip行。我抬头看了一下INSERT ON DUPLICATE KEY UPDATEREPLACE,但是我找不到一种方法让这些使用CASE的多行更新工作。我是否必须为每一行编写一个单独的查询才能使其发挥作用,还是有一种很好的方法可以在MySQL中执行此操作?

Option Id本身不是Key本身,但它是Primary Key的一部分。

编辑一些更多的信息:

我编程PHP,而且基本上我存储了用户的阵列。 Option Id是关键,而Column是价值。因此,对于纯朴的缘故,我的表可能看起来像:

User Id | Option Id | Value 
    10 |   1 | Apple 
    10 |   2 | Shoe 
    11 |   1 | Czar 
... 

也就是说用户可以轻松更新数组中的元素,并添加新的,然后POST阵列到服务器,我想在这种情况下,存储它在桌子上。我上面的查询更新了他们编辑的任何数组元素,但它不会插入新元素。我想知道是否有一个查询,可以从我的数组POST并将其插入到表中,而无需编写循环并查询每个数组元素。

+0

CASE中的ID与预期的结果不符,拼写错误? –

+0

是的,这是一个错字,感谢您指出:) – Paulpro

回答

2

这应该工作,如果Option_Id是一个主键:

REPLACE INTO `Table` (`Option_Id`, `Column`) VALUES 
(1, 'Apple'), 
(2, 'Banana'), 
(3, 'Q-Tip'); 

声明表示:将给予行或替换值,如果PK已经存在。

+0

谢谢!我不知道插入多行的语法。它做到了! – Paulpro

2

当然,它不插入。由于没有这样的价值,它不能得到更新。

我想你是通过加入已经存在的值来规范数据库,并且现在想要为每个有效值添加所需的映射。

因此,最好从头开始,只做插入。

+0

感谢您的答复,我很感激。我为我的问题添加了一些额外的信息。 – Paulpro

0

你总是可以查询条目的数据库,然后选择更新或插入基于侑结果

+0

我的目标是在可能的情况下避免将查询放在php循环中。 – Paulpro

-1

我看到这种更新是没有意义的。
为什么你没有一个带有选项ID和相应值的单独表格,只保留链接到用户ID的选项ID?

相关问题