如果不存在则插入新行,具体取决于同一表的另一行中的列值

时间:2014-08-14 09:15:34

标签: mysql sql

我有一个包含列(id,col_id,type_id,value)的表,如下所示

| id | col_id | type_id | value    |  
------------------------------------
| 1  | 152    | 22      | DGL      |
| 2  | 152    | 27      | AD56JK-5 |
| 3  | 152    | 30      | 5708     |
| 4  | 154    | 22      | JVM      |
| 5  | 154    | 27      | AD29JL-9 |
| 6  | 154    | 30      | 9584     |
| 7  | 155    | 22      | MVR      |
| 8  | 155    | 27      | AD29JM-1 |

我想要做的是每个不同的col_id将type_id = 30的行值更改为type_id = 22 + col_id值的行的值。
例如,值“5708”应更改为“DGL152”,值“9584”应更改为“JVM154”。在col_id = 155的情况下,没有type_id = 30的行,那么我们应该插入一个具有以下值的新行

------------------------------------
| 9  | 155    | 30      | MVR155   |
------------------------------------

表中有很多这样的记录。通过这种方式,我们应该使用type_id = 30更改行的值,或者如果表中的所有记录都不存在,则插入该行。我怎么能这样做?任何人都可以帮我解决问题。

修改 我知道如何使用UPDATE和SET设置更新值,但我要查找的是在单个查询中执行整个更新和插入过程。
谢谢和问候

3 个答案:

答案 0 :(得分:2)

要插入或更新,请使用带有ON DUPLICATE KEY UPDATE子句的INSERT语句。 col_id + type_id必须有唯一的索引才能使其正常工作。

insert into mytable (col_id, type_id, value)
  select col_id, 30 as type_id, concat(value, col_id) as new_value 
  from mytable src 
  where type_id = 22
on duplicate key update value = src.new_value;

答案 1 :(得分:1)

你能试试吗? (它在TSQL中,但你会理解它是如何工作的。)

DECLARE @TAB TABLE (ID INT,COL_ID INT,TYPE_ID INT, VALUE VARCHAR(15))
INSERT INTO @TAB VALUES 
(1,152,22,'DGL152'),
(2,152,27,'AD56JK-5'),
(3,152,30,'5708'),
(4,154,22,'JVM154'),
(5,154,27,'AD29JL-9'),
(6,154,30,'9584'),
(7,155,22,'MVR'),
(8,155,27,'AD29JM-1')

UPDATE  A
SET     A.VALUE = B.VALUE
FROM    @TAB A
JOIN    @TAB B ON A.COL_ID = B.COL_ID
WHERE   A.TYPE_ID = 30
AND     B.TYPE_ID = 22

SELECT * FROM @TAB

结果:

enter image description here

更新后,为新记录编写INSERT语句。

INSERT INTO @TAB VALUES (9,155,30,'MVR155')

编辑:

我读错了这个问题。如果是这种情况,我们可能会使用MERGE。像这样。

DECLARE @TAB TABLE (ID INT IDENTITY(1,1),COL_ID INT,TYPE_ID INT, VALUE VARCHAR(15))
INSERT INTO @TAB VALUES 
(152,22,'DGL152'),
(152,27,'AD56JK-5'),
(152,30,'5708'),
(154,22,'JVM154'),
(154,27,'AD29JL-9'),
(154,30,'9584'),
(155,22,'MVR'),
(155,27,'AD29JM-1')

MERGE @TAB A
USING (SELECT * FROM @TAB WHERE TYPE_ID = 22) B 
ON A.COL_ID = B.COL_ID AND A.TYPE_ID = 30

WHEN MATCHED AND A.TYPE_ID = 30 THEN UPDATE SET
VALUE = B.VALUE

WHEN NOT MATCHED THEN INSERT
(COL_ID,TYPE_ID,VALUE)
VALUES (B.COL_ID,B.TYPE_ID,B.VALUE);

SELECT * FROM @TAB

结果:

enter image description here

顺便说一句是TSQL。

答案 2 :(得分:0)

update b
set b.VALUE = a.VALUE + CONVERT (varchar(5), a.TYPE_ID)
from TABULAR a 
join TABULAR b
on a.COL_ID = b.COL_ID 
where b.[TYPE_ID] = '30' and a.TYPE_ID = '22'

如果TYPE_ID = 30不存在,则使用insert语句