插入不存在

时间:2015-03-04 23:53:35

标签: mysql

我尝试了以下查询:

  INSERT INTO `chat_lines` (`channel`, `nick`, `value`)
    VALUES ('Alfa', 'Beta', '0')
    WHERE NOT EXIST
    (
    SELECT * 
    FROM `chat_lines` 
    WHERE `channel` = 'Alfa' AND `nick` = 'Beta'
    );

如果记录不存在,我该如何插入?

频道和昵称不能是唯一的, 因为一个频道可以有很多刻痕的记录 一个昵称可以有很多频道。

类似的东西:

(Alfa | Alfa)
(Alfa | Beta)
(Beta | Alfa)
(Beta | Beta).

所以,我不希望有两个相同的记录,如

(Alfa|Beta)(Alfa|Beta).

或许还有其他方法可以解决我的问题? 我只想创建具有特定缺口和频道的记录 如果它不存在,如果它存在, 我想提高价值。

@edit 我尝试使用REPLACE。有用。但是......我想改变value = value + 1。它只能在UPDATE AFAIK中使用。我该怎么办?

2 个答案:

答案 0 :(得分:3)

如果每对value只需要一个(nick, channel),请先在此对上创建一个唯一索引:

CREATE UNIQUE INDEX `chat_lines_by_nick_channel`
ON `chat_lines` (`nick`, `channel`);

这使得您可以为这些字段添加值('Staisy', 'nesdev')('Milo', 'nesdev')('Milo', 'fireworks')的行,而不是具有('Milo', 'fireworks')的两个单独行。

然后,您可以使用ON DUPLICATE KEY UPDATE让MySQL更改value而不是插入新行,或INSERT IGNORE INTO chat_lines在尝试插入新行时保持不变。例如,如果要将{1}添加到value,则可以执行以下操作:

INSERT INTO chat_lines (`nick`, `channel`, `lines`)
VALUES ('Chester', 'orchard', 1)
ON DUPLICATE KEY UPDATE `value` = `value` + 1

如果没有符合('Chester', 'orchard')的行,则会添加新行。否则,它会在现有行的value中添加1。

另见:

答案 1 :(得分:1)

简单地做

INSERT IGNORE INTO `chat_lines` (`channel`, `nick`, `value`)
    VALUES ('Alfa', 'Beta', '0');

另见INSERT...ON DUPLICATE KEY UPDATE...(不相关,但相似)。