如果没有这样的行,则插入表中

时间:2012-08-03 16:29:08

标签: mysql

我有一个包含'userid'和'expired'列的会话表。我想检查是否存在具有给定用户ID且未过期的任何行,如果没有找到行,则插入新行。

我读过INSERT IGNORE,但是(userid + expired)不能成为密钥,因为可能有多个行具有相同的用户(全部已过期),我不仅可以有超过1个未过期的用户。 / p>

我试过这个,但无济于事('你有错误......'):

IF (SELECT 1 FROM sessions WHERE user = :user AND expired = 0) <> 1
INSERT INTO sessions (user) VALUES(:user)

('expired'默认为0)。 mySQL版本是5。

更新

我也试过这个:

IF NOT EXISTS(SELECT 1 FROM sessions WHERE user = 0 AND expired = 0)
    INSERT INTO sessions (user) VALUES(0)

使用HeidySQL 7.它既不起作用也不起作用。 mySQL版本是5.5。

UPDATE2 即可。我的陈述中的逻辑错误已修复。

此致

4 个答案:

答案 0 :(得分:2)

使用If exists子句(在本例中为not exists

IF NOT EXISTS(SELECT 1 FROM sessions WHERE user = 0 AND expired = 0)
    INSERT INTO sessions (`user`) VALUES(:user)

修改

    INSERT INTO sessions (`user`) select user from 
    (select :user as user from sessions where not exists(SELECT 1 FROM sessions WHERE user = 0 AND expired = 0)) T1

然后在:user

中输入0或您想要编码的值
    INSERT INTO sessions (`user`) select user from 
    (select 0 as user from sessions where not exists(SELECT 1 FROM sessions WHERE user = 0 AND expired = 0)) T1

答案 1 :(得分:1)

Elvieejo的解决方案似乎很好,除了看起来你不得不使用不存在的问题。

IF NOT EXISTS(SELECT 1 FROM sessions WHERE user = 0 AND expired = 0)
    INSERT INTO sessions (user) VALUES(:user)

答案 2 :(得分:0)

我的陈述的问题是IF EXISTS应该在存储过程中。然而,函数 IF()起作用:

SELECT IF(EXISTS(SELECT 1 FROM sessions WHERE user = 0 AND expired = 0), 0, 1)

现在我正在寻找如何等于0和INSERT INTO语句的普通值。这不起作用:

SELECT IF(EXISTS(SELECT 1 FROM sessions WHERE user = 0 AND expired = 0), 0,
INSERT INTO sessions (user) VALUES (0) SELECT)

如果是C ++,我会说':operands'之间的类型不匹配,并使用逗号运算符。在SQL中它不起作用。

<强>更新

好吧,我刚创建了一个存储例程。仅仅因为我不能使用IF。这个mySQL是多么愚蠢的RDBMS!

答案 3 :(得分:0)

INSERT IGNORE INTO sessions (user) VALUES(:user)