【发布时间】:2021-09-14 18:42:46
【问题描述】:
问题:我有两个表(members1 和 members2),它们只是用户名列表。我需要更改 members1 中的用户名,但前提是新用户名尚未出现在任一表中(换句话说,用户名在两个表中必须是唯一的)。
SQL 超出了我的舒适范围,但经过几个小时的谷歌搜索后,我想出了下面的查询。我实际上使用的是 SQLite 的 C API,所以这只是一个用于检查语法的测试 shell 脚本。该脚本将旧名称更改为新名称,其中$1 是旧名称,$2 是新名称:
#!/usr/bin/env bash
sqlite3 test.db <<EOF
update members1 set uname=
case
exists(select 1 from members1 where uname='$2') or
exists(select 1 from members2 where uname='$2')
when 1 then '$1'
else '$2'
end
where uname='$1';
EOF
问题:
- 这似乎可行,但它有意义吗?似乎很啰嗦。有一个更好的方法吗?特别是如果出现名称冲突,是否真的需要更新
members1才能将旧名称改回原来的名称? - 如果多个进程同时执行相同的操作,这有多安全?进程 A 是否可以将 'john' 更改为 'jim',而进程 B 同时将 'jo' 更改为 'jim',从而使 'jim' 在数据库中出现两次?
- 实际上大写/小写的协议是什么?上面的代码运行没有问题,但网络上的所有内容都是大写的。
谢谢。
【问题讨论】:
-
将用户名存储在一个带有主键的表中,以便从其他表中访问它们!然后,您可以用最少的麻烦来保证唯一性。如有必要,您可以将其他列放在单独的表中。
-
@GordonLinoff - 不幸的是,在现实生活中,数据库更加复杂并且已经有不相关的主键......