我正在为一个拥有大约100到200名成员的小型组织建立一个数据库。这些成员必须支付少量费用才能成为会员。
我创建了一个表格,其中列出了所有成员的详细信息:
------------------------------------------
| First name | Last Name | Address | ...
------------------------------------------
| John | Smith | Street 1 | ...
| Jane | Smith | Street 2 | ...
| ... | ... | ... | ...
现在我想创建一个表格,其中显示成员的姓名以及他们是否支付了费用:
----------------------
| Name | Paid? |
----------------------
| John Smith | yes |
| Jane Smith | no |
| ... | ... |
问题出现了:如果将新成员添加到第一个表中,则应在第二个表中反映出来。如果成员不再是成员,则必须发生同样的情况 我在互联网上搜索解决方案,但只能找到丢弃和重新创建表的地方,但这并不可行,因为第二个表中的数据非常重要。我们不希望已支付费用的会员必须再次支付费用。
我想知道:
P.S。:写完这个问题之后,我想到了创建一个临时表,复制第二个表的数据,重新填充原始数据,然后将数据复制回临时表。对于像SQLiteStudio这样的工具,这似乎非常狡猾并且很难做到。还有更好的方法吗?
答案 0 :(得分:1)
您应该在数据操作方面考虑更多,而不是存储数据。
这是典型的规范化问题。成员中的元组与付费一样多;两者都有相同的主键。所以你应该把两个表结合起来。
添加支付给您的表成员的字段,并默认设置为“no”。
例如:
create table members(
firstname text,
lastname text,
paid bool default false,
-- any other fields
primary key (firstname, lastname)
);
如果你插入:
insert into members(firstname, lastname) values ('john', 'smith');
你会得到:
| firstname | lastname | paid |
|-----------+----------+-------|
| john | smith | false |
或者,您可以保留付费表格,从该表格向成员声明外键约束(因此付费中的任何元组都有成员中的元组)然后假设如果某个成员没有付费,那么它还没有付款。 否则使用该字段的值。
答案 1 :(得分:0)
您可以使用SQLite支持的触发器。
下面的链接显示如何在插入数据上创建触发器:
下一个链接显示了如何在删除数据上创建触发器: