0

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

我已经阅读了有关 INSERT IGNORE 的信息,但是 (userid + expired) 不能作为键,因为可能有多个行具有相同的用户(全部过期),我不能只有超过 1 个未过期的用户。

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

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

(“过期”默认为 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。

更新2。我的陈述中的逻辑错误已修复。

问候,

4

4 回答 4

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

然后输入 0 或您想要编码的值:user

    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
于 2012-08-03T16:31:23.663 回答
1

Elvieejo 的解决方案似乎不错,除了看起来你必须使用 not exists 来解决所述问题。

IF NOT EXISTS(SELECT 1 FROM sessions WHERE user = 0 AND expired = 0)
    INSERT INTO sessions (user) VALUES(:user)
于 2012-08-03T16:39:58.310 回答
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++,我会说“?: 操作数之间的类型不匹配”并使用逗号运算符。在 SQL 中它不起作用。

更新

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

于 2012-08-03T18:58:23.157 回答
0
INSERT IGNORE INTO sessions (user) VALUES(:user)
于 2012-08-03T19:15:15.537 回答