Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.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
IS-A继承中的SQL脚本错误_Sql_Database_Postgresql_Inheritance_Relation - Fatal编程技术网

IS-A继承中的SQL脚本错误

IS-A继承中的SQL脚本错误,sql,database,postgresql,inheritance,relation,Sql,Database,Postgresql,Inheritance,Relation,我尝试在sql中实现一个is-a关系(WARENGRUPPE),该关系现在可以工作,但我在向该关系(WARENGRUPPE)插入一个产品时遇到问题,因为它抛出一个错误,即尽管我将密钥插入了它的子RAUCHWARE,但该密钥未包含在WARENGRUPPE中: 以下是创建过程: /* Tabelle fuer Warengruppe fuer die ISA Beziehung. GruppenID und Kurzbeschreibung */ create table WARENGRUPPE(

我尝试在sql中实现一个is-a关系(WARENGRUPPE),该关系现在可以工作,但我在向该关系(WARENGRUPPE)插入一个产品时遇到问题,因为它抛出一个错误,即尽管我将密钥插入了它的子RAUCHWARE,但该密钥未包含在WARENGRUPPE中: 以下是创建过程:

/* Tabelle fuer Warengruppe fuer die ISA Beziehung. GruppenID und Kurzbeschreibung */
create table WARENGRUPPE(
GruppenID integer,
Beschreibung varchar(200),
primary key (GruppenID) 
);

/* Tabelle fuer Rauchwarengruppe */
create table RAUCHWARE(
Typ varchar(200),
primary key (GruppenID) 
) INHERITS (WARENGRUPPE);

/* Tabelle fuer Schnupfwarengruppe */
create table SCHNUPFWARE(
Koernung integer,
primary key (GruppenID) 
) INHERITS (WARENGRUPPE);

/* Tabelle fuer Kauwarengruppe */
create table KAUWARE(
Konsistenz varchar(100),
primary key (GruppenID) 
) INHERITS (WARENGRUPPE);

/* Tabelle fuer PRODUKT */  
create table PRODUKT(
EAN varchar(100),
Preis integer,
VerfahrensNR integer,
MarkenName varchar(50),
WarenGruppenID integer, 
foreign key (WarenGruppenID) references WARENGRUPPE(GruppenID),
foreign key (VerfahrensNR) references HERSTELLUNGSVERFAHREN(NR),
foreign key (MarkenName) references MARKE(Name),
primary key (EAN)
);
在这里,您可以看到引发错误的加载过程:

INSERT INTO RAUCHWARE (GruppenID,Beschreibung,Typ)
VALUES (1,'Eine Ware die geraucht wird ','Zigarre');


 /* Insert von Produkten */
INSERT INTO PRODUKT (EAN,Preis,VerfahrensNR,MarkenName,WarenGruppenID)
VALUES ('Marlboro Light',5,1,'Marlboro',1);
它的意思是ID=1不包含在WARENGRUPPE中,我将表WARENGRUPPE解释为一个接口,我错了吗

也许有人能帮我

致意 斯特凡·斯普伦格

编辑:

这里是一个链接,它应该做什么,由一个ER图建模
我同意米特兰迪尔的评论。在提问时花点时间检查您真正在做什么/使用哪种配置

关于这个问题:表是表,而不是类。它们的行为不像类。表
WARENGRUPPE
RAUCHWARE
完全不同

inherits
子句只是告诉“我想让
WARENGRUPPE
中定义的所有字段也在
RAUCHWARE
中定义。它并不意味着“是一个”关系。您有两个不同的表,具有一些公共属性


检查一下

我想你有点困惑继承应该如何工作

由于您希望基表/类为WARENGRUPPE,例如RAUCHWARE为WARENGRUPPE的子类,因此您只需指定RAUCHWARE与WARENGRUPPE的特殊/不同之处。子类不需要有自己的主键

所以应该是这样的:

create table WARENGRUPPE(
GruppenID integer,
Beschreibung varchar(200),
primary key (GruppenID) 
);

create table RAUCHWARE(
Typ varchar(200)
) INHERITS (WARENGRUPPE);

INSERT INTO WARENGRUPPE VALUES (1,'Allgemeine Güter und Waren');
INSERT INTO RAUCHWARE VALUES (2,'Rauchwaren', 'Zigarren'); 
create table WARENGRUPPE
(
  GruppenID integer,
  Beschreibung varchar(200),
  primary key (GruppenID) 
);

create table RAUCWARE
(
  GruppenID integer NOT NULL,
  Beschreibung varchar(200),
  FOREIGN key (GruppenID)  REFERENCES WARENGRUPPE (GruppenID)
);

create table SCHNUPFWARE
(
  GruppenID integer NOT NULL,
  Koernung varchar(200),
  FOREIGN key (GruppenID)  REFERENCES WARENGRUPPE (GruppenID)
);

create table KAUWARE
(
  GruppenID integer NOT NULL,
  Konsistenz varchar(200),
  FOREIGN key (GruppenID)  REFERENCES WARENGRUPPE (GruppenID)
);

create table PRODUKT
(
EAN varchar(100),
Preis integer,
VerfahrensNR integer,
MarkenName varchar(50),
WarenGruppenID integer, 
foreign key (WarenGruppenID) references WARENGRUPPE(GruppenID),
foreign key (VerfahrensNR) references HERSTELLUNGSVERFAHREN(NR),
foreign key (MarkenName) references MARKE(Name),
primary key (EAN)
);
RAUCHWARE表将有三列,两列在WARENGRUPPE中定义,一列在它自己的CREATETABLE语句中定义

“人”和“牛仔”之间可能存在一种“是-是”关系。在这里,每个牛仔都是一个人,但不是每个人都是牛仔

create table Person (
  ID integer,
  Name varchar(200),
  primary key (ID) 
);

create table Cowboy (
  HorsesName varchar(200),
  ID integer NOT NULL,
  primary key (ID),
  foreign key (ID) references Person(id)
);

INSERT into Person values (1, 'Jimmy');
INSERT into Person values (2, 'Timmy');

INSERT INTO Cowboy values ('Trigger',2);
提米是一个牛仔,骑着一匹叫“扳机”的马,吉米是一个没有马的普通老人

鉴于图片中的ER模型,您可能希望执行以下操作:

create table WARENGRUPPE(
GruppenID integer,
Beschreibung varchar(200),
primary key (GruppenID) 
);

create table RAUCHWARE(
Typ varchar(200)
) INHERITS (WARENGRUPPE);

INSERT INTO WARENGRUPPE VALUES (1,'Allgemeine Güter und Waren');
INSERT INTO RAUCHWARE VALUES (2,'Rauchwaren', 'Zigarren'); 
create table WARENGRUPPE
(
  GruppenID integer,
  Beschreibung varchar(200),
  primary key (GruppenID) 
);

create table RAUCWARE
(
  GruppenID integer NOT NULL,
  Beschreibung varchar(200),
  FOREIGN key (GruppenID)  REFERENCES WARENGRUPPE (GruppenID)
);

create table SCHNUPFWARE
(
  GruppenID integer NOT NULL,
  Koernung varchar(200),
  FOREIGN key (GruppenID)  REFERENCES WARENGRUPPE (GruppenID)
);

create table KAUWARE
(
  GruppenID integer NOT NULL,
  Konsistenz varchar(200),
  FOREIGN key (GruppenID)  REFERENCES WARENGRUPPE (GruppenID)
);

create table PRODUKT
(
EAN varchar(100),
Preis integer,
VerfahrensNR integer,
MarkenName varchar(50),
WarenGruppenID integer, 
foreign key (WarenGruppenID) references WARENGRUPPE(GruppenID),
foreign key (VerfahrensNR) references HERSTELLUNGSVERFAHREN(NR),
foreign key (MarkenName) references MARKE(Name),
primary key (EAN)
);
您可以在这里尝试:


顺便说一句,我知道事物的德语名称(以英语为母语),但您可能会通过坚持使用英文名称获得更多答案….

首先,SQL Server不支持INHERITS关键字。您使用的是什么数据库系统?PostgreSQL?PostgreSQL是的,我很抱歉,您可能想更改标记…感谢您的帮助,我想我理解这里发生的事情…但我将介绍我的p问题现在更进一步,更具体地说,我有一种产品,这个产品应该分配给Rauchware,Kauware或Schnupfware。,所以如果我查看Warengruppe,我只想看到Rauchware ID 1,Kauware ID 2,Schnupfware ID 3,这是可能的吗?产品应该只在Rauchware,Kauware或Schnupfware中。,当然,只要有一个表rengruppe有三行,并通过正确的id引用products表中的组名作为类别名称。我在上面的问题上附加了一个ER图表。我在SQL中确实是noobish,如果我引用它,它会说,例如,id为1的条目在Warengruppe中不存在。因此我必须明确引用其中一个g组,但我不能单独引用。外键(WarenGruppenID)引用WARENGRUPPE(GruppenID)不起作用,但外键(WarenGruppenID)引用RAUCHWARE(GruppenID)有效,但我只能使用一个产品组。添加答案可能会有所帮助。嘿,很抱歉再次询问,但我如何才能将产品引用到RAUCHWARENGRUPPE。尝试插入到WARENGRUPPE,但我需要在RAUCHWARE中使用不同的产品,否则我有一个WARENGRUPPE 1(Ware zum Rauchen)和一个RAUCHWARE 1(Zigarre)还有RAUCHWARE 1(Zigarette)。但我只能将该产品链接到WARENGRUPPE,我应该可以将其称为typ(Zigarre)作为示例。:-/很抱歉再次打扰您,因为Postgres是一个“对象关系”“数据库你可以把一个表看作一个类——一个表甚至可以有一些类似于成员函数的东西:@a_horse_with_no_name这是一个有趣的例子,但它似乎只不过是围绕DB函数的一点“语法糖”(与
继承
关键字的方式相同)。你能举一个与这里处理的
is-a
关系更相关的例子吗?