【问题标题】:Problems normalizing and inserting data into Oracle music database规范化数据并将数据插入 Oracle 音乐数据库时出现问题
【发布时间】:2017-08-23 08:04:18
【问题描述】:

我正在为初学者 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 或列 规格

NAME 和 TITLE 列的数据类型均为 VARCHAR2(255),而 NUMBER 和 TRACK 列的数据类型为 NUMBER。 我在这个表中也有 ID 和 ALBUMID 列具有相同的数据,就像在 ALBUMS 表中一样。

我非常感谢愿意帮助我填写缺失数据并正确规范表格的任何人。我本应在本周早些时候进行演示,但由于这些问题,我不得不将演示推迟到下周五。

--

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

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: 无效号码

【问题讨论】:

  • 请阅读How to Ask。不要发布指向外部图像的链接。将表格定义放在文本中。谢谢。
  • 插入不使用列列表。

标签: sql oracle metadata


【解决方案1】:

插入以下内容:

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

产生以下错误消息:

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

这是因为ALBUMS 中的ID 列中不允许有NULL 值。

创建表时,可以将表中的任意列指定为NOT NULL。然后,Oracle 将阻止您将 NULL 值插入该列。但是,如果一列是主键(或主键的一部分),它将自动设为NOT NULLALBUMSID 列发生了这种情况。

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

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

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

ORA-01747: 无效的 user.table.column、table.column 或列 规格

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

insert into tracks (name, "NUMBER")
select title, track
from music

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

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

然而,这只是第一个问题。 TRACKS 中的 ID 列需要一个值,而您没有给它任何值。

【讨论】:

  • 您好,感谢您提供信息丰富的帖子。我尝试创建触发器以将值插入到 ALBUMS 和 TRACKS 表的 ID 中,但遇到了问题。我更新了原帖,请看一下。
  • @TimoIlonen:您遇到的“无效数字”错误是因为您试图将带有文本“NULL”的字符串值插入到带有数字的列中。 (包含文本NULL 的字符串与NULL 值不同。)将id 列从INSERT 语句中删除,即insert into albums (genreid, genrename) select id, name from genres,然后触发器应该触发。
猜你喜欢
  • 2017-09-07
  • 2020-12-25
  • 2011-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-21
  • 1970-01-01
相关资源
最近更新 更多