【发布时间】: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。不要发布指向外部图像的链接。将表格定义放在文本中。谢谢。
-
插入不使用列列表。