我正在为一个初学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:无效号码
答案 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
列需要一个值而您没有给它任何东西。