Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有两个FK的SQLite表,但一次只能有一个FK_Sql_Sqlite_Foreign Keys - Fatal编程技术网

具有两个FK的SQLite表,但一次只能有一个FK

具有两个FK的SQLite表,但一次只能有一个FK,sql,sqlite,foreign-keys,Sql,Sqlite,Foreign Keys,我已经为一个问题挣扎了一段时间了。非常感谢您的帮助 这是: 我有两个数据结构,ObjClass和Obj,其中Obj是ObjClass的一个专门化。Obj可能有多个“插槽”,每个插槽都有自己的类型。 一个Obj拥有的总时隙是他自己的时隙与他的ObjClass的时隙的并集。下面是简化的模式(如果有语法错误,请注意): 我要问的是:Slot表与ObjClass或Obj有1-n关系,但决不能两者都有。如何在SQLite上强制执行此操作 注:我猜这个问题可能是由糟糕的数据库设计引起的。任何关于如何以更好的

我已经为一个问题挣扎了一段时间了。非常感谢您的帮助

这是:

我有两个数据结构,ObjClass和Obj,其中Obj是ObjClass的一个专门化。Obj可能有多个“插槽”,每个插槽都有自己的类型。 一个Obj拥有的总时隙是他自己的时隙与他的ObjClass的时隙的并集。下面是简化的模式(如果有语法错误,请注意):

我要问的是:Slot表与ObjClass或Obj有1-n关系,但决不能两者都有。如何在SQLite上强制执行此操作

注:我猜这个问题可能是由糟糕的数据库设计引起的。任何关于如何以更好的设计实现类似结构的想法也将受到赞赏


谢谢

可以有两个FK,都指向
ObjClass
Obj
类似的对象

create table Slot(
    SlotId integer not null primary key,
    SlotType integer,
    FKColumn integer,
    foreign key(SlotType) references ObjClass(ObjClassId),
    foreign key(FKColumn) references Obj(ObjId)
)
编辑:

将与
Obj
/
ObjClass
的关系转换为单独的中间表。创建一个中间表,该表引用所有3个表,如下所示。这样,每个插槽都将与ObjClass/Obj关联

create table SlorforeachObjandObjClass(
    SlotId integer,
    ObjClassId integer,
    ObjId integer, 
    foreign key(ObjClassId) references ObjClass(ObjClassId),
    foreign key(ObjId) references Obj(ObjId),
    foreign key(SlotId) references Slot(SlotId)
) 

但这样就不会强制执行引用的唯一性。我要问的是,如果Slot指向Obj,那么任何FK到ObjClass都应该为NULL。顺便说一句,SlotType列不是引用,它只是插槽的标识符。我没有在那里放置任何FK,因此不会影响答案。这种关系更像是“ObjClass/Obj有一个槽”,而不是“槽是一个ObjClass/Obj”。抱歉,在结束之前确认了评论。是的。引用:“我要问的是:Slot表与ObjClass或Obj有1-n关系,但决不能两者都有。我如何在SQLite上强制执行?”。编辑也没有帮助,因为(我再次引用)“一个Obj可能有多个“槽”,每个槽都有自己的类型”。顺便说一句,谢谢你的帮助,我知道我不是很容易对付。我从中得到的是:如果一个FK有值,就没有办法强制一个FK必须为NULL(也就是说,不接受两个FK上都有值的记录)?我必须在应用程序代码中强制这样的约束吗?现在我明白了。是的,这必须通过应用程序代码强制执行,或者您也可以使用插入前触发器(如果SQLite支持,我不确定是否支持)。插槽使用的可能重复可能是反模式,EAV。第一条评论:这个问题是特定于SQLite的,没有任何答案考虑到这一点(即:鉴于此处使用的技术,它们不适用)第二条评论:可能是,但这并不能回答问题。1.你怎么会这么想?Slot=setting.2.我只是想你可能想知道。为什么?1.我有一个错误。当我在SQLite上找不到关于检查约束的文档时,我认为它不支持这些约束。现在我知道了,它工作起来很有魅力。谢谢。2:Gue对不起,我只是太粗鲁了。
create table SlorforeachObjandObjClass(
    SlotId integer,
    ObjClassId integer,
    ObjId integer, 
    foreign key(ObjClassId) references ObjClass(ObjClassId),
    foreign key(ObjId) references Obj(ObjId),
    foreign key(SlotId) references Slot(SlotId)
)