规范化并将数据插入Oracle音乐数据库的问题

时间:2017-03-29 17:25:11

标签: sql oracle metadata

我正在为一个初学SQL课程的学校项目工作,我已经将我的音乐库元数据的一部分上传到Oracle:

CREATE TABLE  "MUSIC" 
   (    "ID" NUMBER, 
    "TITLE" VARCHAR2(255), 
    "ARTIST" VARCHAR2(30), 
    "ALBUM" VARCHAR2(255), 
    "TRACK" NUMBER, 
    "YEAR" NUMBER, 
    "GENRE" VARCHAR2(255), 
    "FILENAME" VARCHAR2(255), 
    "NAMEID" NUMBER, 
     CONSTRAINT "MUSIC_PK" PRIMARY KEY ("ID") ENABLE
   )
/

CREATE OR REPLACE TRIGGER  "bi_MUSIC" 
  before insert on "MUSIC"              
  for each row 
begin  
  if :new."ID" is null then
    select "MUSIC_SEQ".nextval into :new."ID" from sys.dual;
  end if;
end;

/
ALTER TRIGGER  "bi_MUSIC" ENABLE
/

CREATE TABLE  "ALBUMS" 
   (    "ID" NUMBER, 
    "ARTISTID" NUMBER, 
    "NAME" VARCHAR2(255), 
    "RELEASEDATE" NUMBER, 
    "GENREID" NUMBER, 
    "GENRENAME" VARCHAR2(255), 
     CONSTRAINT "ALBUMS_PK" PRIMARY KEY ("ID") ENABLE
   )
/
ALTER TABLE  "ALBUMS" ADD CONSTRAINT "ALBUMS_CON2" FOREIGN KEY ("ARTISTID")
      REFERENCES  "ARTIST" ("ID") ENABLE
/
ALTER TABLE  "ALBUMS" ADD CONSTRAINT "ALBUMS_CON3" FOREIGN KEY ("GENREID")
      REFERENCES  "GENRES" ("ID") ENABLE
/
CREATE TABLE  "ARTIST" 
   (    "ID" NUMBER, 
    "NAME" VARCHAR2(255), 
     CONSTRAINT "ARTIST_PK" PRIMARY KEY ("ID") ENABLE
   )
/
CREATE TABLE  "GENRES" 
   (    "ID" NUMBER, 
    "NAME" VARCHAR2(255), 
     CONSTRAINT "GENRES_PK" PRIMARY KEY ("ID") ENABLE
   )
/
CREATE TABLE  "TRACKS" 
   (    "ID" NUMBER, 
    "ALBUMID" NUMBER, 
    "NAME" VARCHAR2(255), 
    "NUMBER" NUMBER, 
     CONSTRAINT "TRACKS_PK" PRIMARY KEY ("ID") ENABLE
   )
/
ALTER TABLE  "TRACKS" ADD CONSTRAINT "TRACKS_CON3" FOREIGN KEY ("ALBUMID")
      REFERENCES  "ALBUMS" ("ID") ENABLE
/

MUSIC表不是实际层次结构的一部分,只允许我将数据上传到数据库,然后将其插入ALBUMS,ARTIST,GENRES和TRACKS表。我在这4个表之间分配了主键和外键,如本问题的最佳答案所述,以及我没有的修剪列: Music library MySQL database

我已经成功插入了一些数据,但现在我遇到了将数据插入ALBUMS表中的GENRENAME和GENREID列的问题。插入以下内容:

insert into albums (genrename, genreid)
select name, id
from genres

产生以下错误消息:

  

ORA-01400:无法插入NULL(“TIMOILONEN”。“ALBUMS”。“ID”)`

我已经有两个列(ID和ARTISTID)在这个表中具有相同的值,我甚至不确定是否允许。

此外,尝试将缺失数据插入TRACKS表会产生错误:

insert into tracks (name, number)
select title, track
from music`
  

ORA-01747:user.table.column,table.column或column无效   说明书

NAME和TITLE列都包含数据类型VARCHAR2(255),而NUMBER和TRACK列的数据类型为NUMBER。 我还在此表中具有相同数据的ID和ALBUMID列,就像在ALBUMS表中一样。

我非常感谢任何愿意帮助我填写缺失数据并正确规范表格的人。本周早些时候我已经提出了这个问题,但由于这些问题,我不得不将我的演讲推迟到即将到来的星期五。

-

根据下面给出的建议,我为ALBUMS和TRACKS表创建了触发器,用于将值插入ID列,从MUSIC表中复制插入ID正常工作的命令。但是,我仍然不确定我应该用什么样的命令来激活触发器。

CREATE OR REPLACE TRIGGER  "bi_TRACKS" 
  before insert on "TRACKS"              
  for each row 
begin  
  if :new."ID" is null then
    select "MUSIC_SEQ".nextval into :new."ID" from sys.dual;
  end if;
end;

/
ALTER TRIGGER  "bi_TRACKS" ENABLE
/   

CREATE OR REPLACE TRIGGER  "bi_ALBUMS" 
  before insert on "ALBUMS"              
  for each row 
begin  
  if :new."ID" is null then
    select "MUSIC_SEQ".nextval into :new."ID" from sys.dual;
  end if;
end;
/
ALTER TRIGGER  "bi_ALBUMS" ENABLE
/


insert into albums (genreid, genrename, id)
select id, name, 'NULL'
from genres
  

ORA-01722:无效号码

1 个答案:

答案 0 :(得分:2)

  

插入以下内容:

insert into albums (genrename, genreid)
select name, id
from genres
     

产生以下错误消息:

     
    

ORA-01400:无法插入NULL(" TIMOILONEN"。" ALBUMS"。" ID")`

  

这是因为ID中的ALBUMS列不允许包含NULL个值。

创建表格时,您可以将表格中的任何列指定为NOT NULL。然后,Oracle将阻止您将NULL值插入该列。但是,如果列是主键(或主键的一部分),则会自动生成NOT NULL。这发生在ID的{​​{1}}列。

如果要将相册插入ALBUMS,则必须为数据库提供要创建的相册的ID。您可以将这些ID的值指定到用于将数据放入这些表的ALBUMS语句中。或者,您可以使用序列和触发器将值插入INSERT列,就像使用ID表一样。如果您使用的是Oracle 12c,也可以使用标识列。

  

此外,尝试将缺失的数据插入TRACKS表   产生错误:

MUSIC
     
    

ORA-01747:user.table.column,table.column或column无效     说明书

  

这是一个更不幸的问题。这里的Oracle反对一个名为insert into tracks (name, number) select title, track from music 的列,因为还有一个名为number的数据类型,它无法区分。 (对于任何数据库,如果列名与数据库识别的关键字相同,则可能会遇到问题。)您可以通过将列重命名为NUMBER来解决此问题,或者通过放置双引号中的列名:

TRACK_NUMBER

无论哪种方式,请注意您可能会看到错误

  

ORA-01400:无法插入NULL(" TIMOILONEN"。" TRACKS"。" ID")

然而,这只是第一个问题。 <{1}}中的insert into tracks (name, "NUMBER") select title, track from music 列需要一个值而您没有给它任何东西。