我有一个包含'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 即可。我的陈述中的逻辑错误已修复。
此致
答案 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
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)