【发布时间】:2011-08-14 19:46:27
【问题描述】:
我有两张桌子。 “用户”和“付费用户”
Paying_users 当然有更多关于付款的信息。
我正在寻找一种在插入时能够强制使用两个表通用的唯一用户名的方法。 因此,如果“Shelly”在“users”上,我将无法将“Shelly”插入“paying_users”。 这在 MYSQL 上可行吗?
【问题讨论】:
我有两张桌子。 “用户”和“付费用户”
Paying_users 当然有更多关于付款的信息。
我正在寻找一种在插入时能够强制使用两个表通用的唯一用户名的方法。 因此,如果“Shelly”在“users”上,我将无法将“Shelly”插入“paying_users”。 这在 MYSQL 上可行吗?
【问题讨论】:
您为什么不使用 users 作为主表并将 pay_users(我认为是用户的一部分)与用户的 id 相关联?那么,你就不会有重复的问题了。
users:
id: ...
name: ...
other information
paying_users:
id: ...
users_id: ...
other information:
【讨论】:
Paying_users 仍然是用户,对吧?那么这将解决您的问题:
users:
id: ...
name: ...
other information that relates to a user
PRIMARY KEY: id
UNIQUE KEY: name
paying_users:
id: ...
other information that relates a paying user only
PRIMARY KEY: id
FOREIGN KEY: id
REFERENCES users(id)
users(因此他的 name 在所有用户中都是唯一的)id 添加到表paying_users,以及仅与付费用户相关的其他数据。其他优势:
当您有一个(简单)用户决定付款时,您只需执行第 2 步。
当您有一个paying_user 的付款期限已过时,您只从paying_users 表中删除他的记录,因此他仍然是一个简单用户。
【讨论】:
我认为在 MySQL 中不可能做到这一点。如果可能,最好设计一个用户表。然后,您将为那些正在付款的客户创建一个包含用户 ID 和 pyament 信息的辅助表,并且您可以在必要时加入
【讨论】:
尝试将您的 INSERT 与 SELECT 结合使用。例如:
INSERT INTO paying_users
SELECT 'Shelly', 'other', 'column', 'values'
WHERE (SELECT COUNT(1) FROM users WHERE username = 'Shelly') = 0
我不确定,没有尝试过这个特定的结构,但您可能需要创建一个 1 行的虚拟表来选择您的数据:
INSERT INTO paying_users
SELECT 'Shelly', 'other', 'column', 'values'
FROM (SELECT 1) AS dummy
WHERE (SELECT COUNT(1) FROM users WHERE username = 'Shelly') = 0
【讨论】:
SELECT COUNT(1) FROM users WHERE username = 'Shelly' 将返回用户名为“Shelly”的用户数。该语句周围的括号会将结果插入到周围的 where 子句中,使其本质上是WHERE %matching_users% = 0。这将具有仅在没有匹配用户时返回一行的效果,因此仅在没有匹配用户时插入。但是,如果可以选择更改底层数据库设计,那么这并不是最好的方法。在那种情况下,我会选择 ypercube 的答案。