Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.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
Oracle SQL创建表以满足需求_Sql_Oracle_Oracle11g_Oracle Sqldeveloper - Fatal编程技术网

Oracle SQL创建表以满足需求

Oracle SQL创建表以满足需求,sql,oracle,oracle11g,oracle-sqldeveloper,Sql,Oracle,Oracle11g,Oracle Sqldeveloper,画廊经常陈列一些库存物品 具有相同的起始日期和相同的期限。他们实际上创建了一个画廊 以特定艺术家、媒体或其他主题为主题的展览 我想记录一个数字展览代码作为 标识符、展览名称、展览主题(A:艺术家、M:媒体或O: 其他),展示艺术品的详细信息和艺术品总数 这些构成了这次展览。展览必须至少包含一件艺术品 我有表格画廊和艺术品,其中包含我需要的信息,即画廊id和艺术家代码/艺术品编号(一对用来确定艺术品是什么,因为艺术家可以在多个艺术品中提交),因此我将加入这两个表格 这意味着从技术上讲,库存中的多件

画廊经常陈列一些库存物品 具有相同的起始日期和相同的期限。他们实际上创建了一个画廊 以特定艺术家、媒体或其他主题为主题的展览

我想记录一个数字展览代码作为 标识符、展览名称、展览主题(A:艺术家、M:媒体或O: 其他),展示艺术品的详细信息和艺术品总数 这些构成了这次展览。展览必须至少包含一件艺术品

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

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

我把展览id缩短为展览id,如果这让人困惑的话。 如果我想创建一个表,以便在搜索exhibit_id=1时,它会显示与其关联的艺术品,那么我的约束应该是什么?我怎样才能做到呢 展览必须至少包含一件艺术品 创建表格展示( 附件号(7)不为空, 艺术家代码(4)不为空, 艺术品编号(5)不为空, 附件开始日期不为空, 附件\结束\日期不为空, 附件_主题字符(1)不为空, 画廊标识号(3)不为空 );

artwork_no no no no(5)NOT NULL(带有artwork table的foreing键)将完成此工作

我将详细说明注释:

    你已经有了展品表(虽然我会考虑把它改名为“展览会”,如果可能的话)
  • 你已经有了艺术品桌
  • 您应该创建一个新的展品项目表,其中包含展品id(用于识别展览)栏以及艺术品编号和艺术家代码(用于参考艺术品)
  • 为艺术品添加外键约束(如上面示例中的约束)和exhibit_id
  • 表格展览中的artwork_no和Artister_code列以及相应的外键不再需要
现在,您可以通过在exhibit_item表中插入记录将艺术品“添加”到展览中,以下语句将为您提供展示“展览馆”所需的所有信息:

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


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

您是否希望Oracle强制执行一个事实,即一件艺术品不能以重叠的日期范围出现在不同的画廊中?(不能同时在两个地方)我不知道这到底意味着什么,但这个展览桌只是为了记录艺术品是展览的一部分,我已经有了一张展示画廊中艺术品展示的表格。这意味着:我目前可以创建记录,说艺术品1在2021年1月1日至2021年2月1日期间在画廊1中,艺术品1在2021年1月2日至2021年2月2日期间在画廊2中。很明显,这是不可能的,你所说的“展览”是什么意思?对我来说,展览是“展览”中的一个项目,但不清楚你是否将这两个术语混为一谈,因为你的语言谈论的是“展览”,而你的代码谈论的是“展览”。此外,对我来说,“展览”发生在“画廊”中,“艺术品”是“展览”,如果它是“展览”的一部分。这意味着“展览”指的是“画廊”(或者你的展览可以跨越几个画廊?),而“展览”将“艺术品”链接到“展览”。如果展览跨越多个画廊,那么在一个展览期间艺术品可以在画廊之间移动吗?我想说,应该有三张桌子,展览,艺术品和一张桌子连接这两张桌子
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 );
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=...