如何在SQLITE3中创建一对多关系?

11

如何在SQLITE3中创建一对多关系?我有两个表:

Mans:
_id   name
 1    antony
 2    fred
and
   point
_id   date   point   
 1     23     77
       24     99 

 2     25     78
        5     0

我不懂SQL语法,请帮忙。


我怀疑第二个表不是这样的 - 这些是SQL表还是您要输入的数据? - mmmmmm
2个回答

21
根据iamkrillin所写的内容:
CREATE TABLE (points) points_id INT
FOREIGN KEY(man_id) REFERENCES mans(PrimaryKeyField)
ON DELETE CASCADE ON UPDATE CASCADE

这里有一个现实世界的例子。假设有一些人向你推荐业务:你的员工、朋友、你做广告的本地企业等等。来访的客户被称为“推荐”业务。每个人只算作一个推荐,但一个推荐者可能会推荐很多个推荐(例如,一个员工可能会推荐20个新客户;这个员工是你的推荐者,并且这个员工已经做了20个推荐)。因此,你有1个推荐者和20个推荐(一对多):
CREATE TABLE referal(                                         
  referal_id INTEGER UNIQUE NOT NULL PRIMARY KEY,           //A customer can only be 1 referal.
  referal_method TEXT,                                      //How were they refered?  By phone?
  referer_id INTEGER ,                                      //Who refered them?
  FOREIGN KEY(referer_id) REFERENCES referer(referer_id));  //Trace more about referer.

现在,有可能会有多个人引荐一个推荐人,但我认为只对单个引荐人进行补偿是标准商业惯例。因此,您永远不需要列出两个引荐人。这将始终是1对1或1对多的关系;因此,您应该将其设置为1对多表。我对级联处理方面不是很精通,但我会尝试弄清楚其适用方式。
乍一看,似乎ON UPDATE CASCADE ON DELETE CASCADE不属于我的答案,因为删除最后一个推荐人不应删除引荐人。
查看另一个示例
CREATE TABLE all_candy 
   (candy_num SERIAL PRIMARY KEY,
    candy_maker CHAR(25));

CREATE TABLE hard_candy 
   (candy_num INT, 
    candy_flavor CHAR(20),
    FOREIGN KEY (candy_num) REFERENCES all_candy
    ON DELETE CASCADE)

如果你从硬糖表(hard_candy)中删除一颗硬糖,那么也会从所有糖果表(all_candy)中删除它,因为硬糖是糖果的一种,如果糖果类型已更改(例如停产的糖果),则无论如何都需要执行新的INSERT命令。
我在sqlite3中运行了ON UPDATE CASCADE和ON UPDATE DELETE的测试用例,但似乎没有效果。也许它们不适用于sqlite3的默认数据库引擎,但这些功能在SQLite官方网站上有详细描述且易于跟进:sqlite.org上关于ON UPDATE CASCADE的示例。请阅读并看看您的想法。
这是我用于测试的模式:
BEGIN TRANSACTION;
CREATE TABLE candy(id integer primary key not null, name text, description text);
INSERT INTO candy VALUES(1,'Laffy Taffy', 'Delicious, soft candy.');
INSERT INTO candy VALUES(2,'Pop Rocks', 'A candy that explodes in your mouth.');
COMMIT;

BEGIN TRANSACTION;
CREATE TABLE hard_candy(id integer primary key not null, name text, description text, foreign key(id,name,description) references hard_candy ON DELETE CASCADE ON UPDATE CASCADE);
INSERT INTO hard_candy VALUES(2,'Pop Rocks', 'A candy that explodes in your mouth.');
COMMIT;

对id为2的表格的描述字段进行了各种更新。


3
这个的语法如下所示...
CREATE TABLE (MySecondTable) Foo INT FOREIGN KEY(Foo) REFERENCES MyFirstTable(PrimaryKeyField) ON DELETE CASCASDE ON UPDATE CASCASDE

仅适用于v3.6.1及以上版本

这里是文档:http://sqlite.org/foreignkeys.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接