插入语句的Oracle SQL问题

时间:2010-09-10 23:21:14

标签: sql oracle

所以我是这个的初学者,并试图跟随我的教授指示如何完成这个。它们如下:

考虑表1-3中描述的关系数据库。带下划线的属性是表的主键。使用您的Oracle帐户创建此数据库并插入每个表中列出的元组。确保包含主键和外键约束。将检查约束放在以下三个属性上。等级(介于0和10之间),冷冻(大于0),释放日期(1/1/1900之后)。

表1:剧院
姓名(加下划线为主要),城市,州,邮编,电话

表2:电影
标题(主要),评级,长度,发布日期

表3:显示了 TheatreName,MovieTitle(BOTH列为主要)

以下是我宣布它们的方式:

CREATE TABLE Theatres (
Name   varchar2(50) not null,
City   varchar2(50) not null,
State   varchar2(50) not null,
Zip   number not null,
Phone   varchar2(50) not null,
CONSTRAINT name_pk PRIMARY KEY (Name)
);

create table Movies (
Title   varchar2(100),
Rating NUMBER CONSTRAINT Rating_CHK CHECK (Rating BETWEEN 0 AND 10),
Length NUMBER CONSTRAINT Length_CHK CHECK (Length > 0),
ReleaseDate date CONSTRAINT RDATE_CHK CHECK (ReleaseDate > to_date('1/January/1900', 'DD/MONTH/YYYY')),
CONSTRAINT title_pk PRIMARY KEY (Title)
);

create table ShownAt (
TheatreName varchar2(50),
MovieTitle varchar2(100),
CONSTRAINT moviet_fk FOREIGN KEY (MovieTitle) REFERENCES Movies(Title),
CONSTRAINT shown_pk PRIMARY KEY (TheatreName, MovieTitle)
);

这声明很好,我没有错误。下面是我的插页(我为每个表提供了一个示例插入):

insert into theatres values ( 'Great Escape 14', 'Wilder', 'KY', '41076', '(859) 442-0000' );
insert into movies values ( 'The Expendables', '7.6', '103', '13 August 2010' );
insert into shownat values ( 'Great Escape 14', 'The Expendables' );

所有插入影院和电影的插片都顺利完成。对于ShownAt,我得到了很多错误,其中大部分都是这样的:

Error starting at line 37 in command:
insert into shownat values ( 'Showcase Cinema De Lux Florence', 'The Pianist' )
Error report:
SQL Error: ORA-02291: integrity constraint (LANGB1.MOVIET_FK) violated - parent key not found

含义:

02291. 00000 - "integrity constraint (%s.%s) violated - parent key not found"
*Cause:    A foreign key value has no matching primary key value.
*Action:   Delete the foreign key or add a matching primary key.

任何插入ShownAt的标题只有一个单词(比如电影Up)都可以正常工作,但任何有多个单词的内容(如The Expendables)都不会执行,并给出上述错误。任何帮助将非常感激。我可以发布您需要的任何其他详细信息。

1 个答案:

答案 0 :(得分:1)

当单个单词键成功时,没有技术原因可以解释为什么包含多个单词的主键会失败。

通常,避免对主键列使用长VARCHAR2(或任何字符串数据类型)是个好主意。这是因为更容易引入错误的案例或额外空格的错误。以下是所有不同的值:'The Pianist', 'The pianist', 'The Pianist '

因此,对于某些插入到ShownAt失败的一个解释是转录错误:多字,混合大小写的密钥的额外复杂性使得更有可能在失败的语句中没有完全正确地获得密钥。