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



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

/* 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)
);

在这里你可以看到LOAD过程,它抛出一个错误:

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中,我把表WARENGRUPE解释成一个接口,我错了吗?

也许有人可以帮我

致以最诚挚的问候Stefan Sprenger

编辑:

以下是它应该做什么的链接,由ER DIAGRAMM建模https://www.dropbox.com/s/d8l8ry5hulx3u61/ERExample.jpg

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

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

所以它可能是这样的:

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'); 

RAUCHWARE表将有三列,其中两列在WARENGRUPPE中定义,一列在它自己的create table语句中定义。

is-a关系可能是"人"one_answers"牛仔"之间的关系。在这里,每个牛仔都是一个人,但并不是每个人都是牛仔。

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 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)
);

你可以在这里试试:http://sqlfiddle.com/#!10/2d229/1

顺便说一句,我用德语称呼事物(母语为德语),但你可能会用英语称呼事物,从而获得更多答案。。。。

我同意密特兰迪尔的评论。在提问时,请慢慢检查您实际在做什么/使用的配置。

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

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

检查postgresql文档

最新更新