我正在用oracle sql实现一个小型数据库来存储关于歌曲和艺术家的信息
create type song_t as object
(
SONGID INTEGER,
TITLE varchar2(100),
GENRE varchar2(100),
DATE_OF_CREATION date,
BPM NUMBER
);
create type artist_t as object
(
ARTISTID INTEGER,
NAME varchar2(100),
SURNAME varchar2(100),
DATE_OF_BIRTH date
);
create table SONG(
SONGID INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY not null,
TITLE varchar2(100),
GENRE varchar2(100),
DATE_OF_CREATION date DEFAULT sysdate,
BPM NUMBER
);
/
create table ARTIST(
ARTISTID INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY not null,
NAME varchar2(100) not null,
SURNAME varchar2(100) not null,
DATE_OF_BIRTH date
);
create table ARTIST_SONG_CONNECTION(
SONG_C REF song_t not null,
ARTIST_C REF artist_t not null
);
所以我想做的是做一个过程,插入一首知道他的id的艺术家的新歌,并引用位于他们的表上的特定歌曲和特定艺术家。
对于这样的数据库结构是否可以做到这一点,或者我是否需要创建一个包含CREATE TABLE SONGS_REF OF song_t
之类对象的表?
2条答案
按热度按时间xtfmy6hx1#
如果要使用对象,请使用对象派生表:
然后,您可以创建表:
但是,不能为对象派生表指定
IDENTITY
列(但可以将DEFAULT
与序列一起使用)。更新
如果您需要
artist_song_connection
的详细信息,则可以使用song
表中的VIEW
:fiddle
h7appiyu2#
对我来说,这看起来像是一个 * 普通的 * 引用完整性问题--只需要创建一个从
song
表到artist
的外键,并在song
表中包含一个新列(artistid
)。我认为您不需要任何其他类型(虽然您创建了两个类型)。
程序: