首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle SQL创建表以满足要求

Oracle SQL创建表以满足要求
EN

Stack Overflow用户
提问于 2020-11-08 16:00:21
回答 2查看 77关注 0票数 0

画廊经常展示相同起始日期和相同时期的库存中的几个项目。他们实际上创建了一个画廊展览,以特定的艺术家,媒体或其他主题为主题。

我想记录一个数字展览代码作为标识符、展览名称、展览主题( A:艺术家、M:媒体或O:其他)、展出的艺术品的详细信息以及组成展览的艺术品总数。一个展览必须至少包含一幅插图。

我有表画廊和艺术,其中包含我需要的信息,即gallery_id和艺术家代码/艺术作品_no(一对,以确定它是什么艺术作品,因为艺术家可以在多个艺术作品中提交),因此我将加入这两个表。

这意味着从技术上讲,库存中的多件艺术品可以成为展览的一部分,我想要记录下来。这意味着应该至少有一个与展览相关联的艺术品,因此可以有一个或多个与展览相关联的艺术品。

如果这让人困惑的话,我将exhibtion_id缩写为exhibit_id。如果我想创建一个表,以便当我搜索exhibit_id =1时,它会显示与其关联的艺术作品,那么我的约束条件应该是什么?如何实现展览必须至少包含一个艺术品创建表展示( exhibit_id NUMBER(7) NOT NULL、artist_code NUMBER(4) NOT NULL、artwork_no NUMBER(5) NOT NULL、exhibit_start_date DATE NOT NULL、exhibit_end_date DATE NOT NULL、exhibit_theme CHAR(1) NOT NULL、gallery_id NUMBER(3) NOT NULL );

代码语言:javascript
复制
ALTER TABLE exhibit
    ADD CONSTRAINT chk_exhibit_theme CHECK ( exhibit_theme IN (
        'A',
        'M',
    'O'
    ) );

COMMENT ON COLUMN exhibit.exhibit_id IS
    'surrogate key added to replace exhibit composite PK';

COMMENT ON COLUMN exhibit.artist_code IS
    'Code/Identifier for artist';

COMMENT ON COLUMN exhibit.artwork_no IS
    'Identifier for artwork within this artist';

COMMENT ON COLUMN exhibit.exhibit_start_date IS
    'Date exhibition in the gallery began';

COMMENT ON COLUMN exhibit.exhibit_end_date IS
    'Date exhibition ends';

COMMENT ON COLUMN exhibit.exhibit_theme IS
       'Exhibition Theme
A -  Artist
M -  Media
O -  Other

';

COMMENT ON COLUMN exhibit.gallery_id IS
    'Identifier for Gallery';

ALTER TABLE exhibit ADD CONSTRAINT gallery_painting_pk PRIMARY KEY ( exhibit_id );

ALTER TABLE exhibit
    ADD CONSTRAINT exhibit_uq UNIQUE ( exhibit_start_date,
                                       exhibit_end_date,
                                       gallery_id );


ALTER TABLE exhibit
    ADD CONSTRAINT artwork_exhibit FOREIGN KEY ( artwork_no,
                                                 artist_code )
        REFERENCES artwork ( artwork_no,
                             artist_code );

ALTER TABLE exhibit
    ADD CONSTRAINT gallery_display FOREIGN KEY ( gallery_id )
        REFERENCES gallery ( gallery_id );
EN

回答 2

Stack Overflow用户

发布于 2020-11-09 23:38:46

artwork_no号(5)不为空,并且带有指向artwork表的前缀键即可完成此工作

票数 0
EN

Stack Overflow用户

发布于 2020-11-10 05:03:47

我将详细介绍Turo's注释:

  • 您已经有了展览表(不过,为了更清楚起见,我会考虑将其重命名为“

”)

  • 您已经有了图片表
  • 您应该创建一个新的exhibit_item表,其中包含列exhibit_id (用于标识展览)以及artwork_no和artist_code (用于引用图稿)
  • 为图稿添加外键约束(如上面示例中的那些)和展览表中的展示列artwork_no和artist_code列以及相应的外键,不再需要

F212

现在,您可以通过在exhibit_item表中插入记录来将艺术作品“添加”到展览中,下面的语句将为您提供显示“展览馆”所需的所有信息:

代码语言:javascript
复制
SELECT *
  FROM EXHIBIT_ITEM AS EI
    JOIN EXHIBIT AS EX ON (EI.exhibit_id=EX.exhibit_id)
    JOIN ARTWORK AS AW ON (AW.artwork_no=EI.artwork_no AND AW.artist_code=EI.artist_code)
  WHERE EX.exhibit_id=...

当然,您可以只选择一些特定的列,确切的WHERE子句将取决于您的详细要求。

如果需要像Caius Jard提出的“不允许在重叠的展览上展出一件艺术品”这样的限制,可以使用数据库触发器来实现。但这是一个不同的故事。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64735969

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档