4

我有一个像这样的“用户”SQL 表结构(ID 是随机生成的,不是自动递增的):

ID    name     deleted    lastActive
3242  Joe      0          20-6-2012 23:14
2234  Dave     0          20-6-2012 23:13
2342  Simon    1          20-6-2012 23:02
9432  Joe      1          20-6-2012 22:58

可以有多个已删除 (deleted=1) 的同名用户,但只有 1 个未删除的同名用户(所以添加 Simon 可以,但 Dave 不行)。只有在一个 SQL 查询中没有同名且已删除 = 0 的记录时,如何才能插入?我需要这样的东西:

INSERT INTO users (ID, name) VALUES ($id, $name) 
    WHERE NOT EXISTS (SELECT 1 FROM users WHERE name = $name AND deleted = 0)

但这不是正确的语法。

4

4 回答 4

3

设置一个 LEFT JOIN

  • 子查询 A 包含别名为 ID 的随机数和别名为 name 的 $name。
  • 子查询 B 选择未删除的 name = $name。
  • LEFT JOIN A 到 B 并返回 A.* 如果它没有 LEFT JOIN 的右侧对应项

这是查询

INSERT INTO users (ID,name)
SELECT A.* FROM
(SELECT RAND() ID,'$name' name) A LEFT JOIN
(SELECT name FROM users WHERE name='$name' AND deleted=0) B
USING (name) WHERE B.name IS NULL;
于 2012-06-21T20:50:23.697 回答
1

使用MySQL 的 REPLACE 语法

确保 ID 是主键或唯一键,并在所有三个 ID、名称和已删除列上创建索引。

REPLACE INTO users (ID, name) VALUES ($id, $name) 
于 2012-06-21T20:02:28.243 回答
0
INSERT INTO users (ID, name) 
SELECT $id, $name WHERE NOT EXISTS (
    SELECT 1 FROM users WHERE name = $name AND deleted = 0
)
于 2012-06-21T19:46:52.473 回答
0
INSERT INTO users SELECT '1', 'Bob','','' FROM DUAL WHERE NOT EXISTS(SELECT ID FROM users WHERE name = 'Bob' AND deleted ='0' LIMIT 1)
于 2012-06-21T20:11:46.440 回答