2012-12-10 25 views
1

我目前正在使用hsqldb。我的create语句看起来像:ArrayIndexOutOfBoundException - hsqldb?

CREATE TABLE Movie 
(
    movieId INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, 
    title VARCHAR(255) NOT NULL, 
); 

CREATE TABLE Playlist(
    id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, 
    name VARCHAR(255) NOT NULL, 
); 

CREATE TABLE PlaylistMovies(
    mid INTEGER FOREIGN KEY REFERENCES Movie(movieid), 
    pid INTEGER FOREIGN KEY REFERENCES Playlist(id),  
    PRIMARY KEY (mid, pid) 
); 
//my assoziation table which safes the movie ids and playlist ids 


alter table playlistmovies 
    add constraint fk_plm_playlist 
    foreign key (pid, mid) references playlist(id) 
    on delete cascade; 

,当我想做的事:

INSERT INTO PlaylistMovies(MID, PID) VALUES (1,1); 

我得到:

enter image description here

然而,其他两个表中存在的数据,因此一个参考应该是可能的?

这里有什么问题,以及如何解决它?

UPDATE:

版本我用:HSQLDB-2.2.8

java.sql.SQLException: java.lang.ArrayIndexOutOfBoundsException: 1 java.lang.Arr 
ayIndexOutOfBoundsException: 1 
     at org.hsqldb.jdbc.Util.sqlException(Unknown Source) 
     at org.hsqldb.jdbc.Util.sqlException(Unknown Source) 
     at org.hsqldb.jdbc.JDBCStatement.fetchResult(Unknown Source) 
     at org.hsqldb.jdbc.JDBCStatement.execute(Unknown Source) 
     at org.hsqldb.util.DatabaseManagerSwing.executeSQL(Unknown Source) 
     at org.hsqldb.util.DatabaseManagerSwing.access$1000(Unknown Source) 
     at org.hsqldb.util.DatabaseManagerSwing$StatementExecRunnable.run(Unknow 
n Source) 
     at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251) 
     at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:721) 
     at java.awt.EventQueue.access$200(EventQueue.java:103) 
     at java.awt.EventQueue$3.run(EventQueue.java:682) 
     at java.awt.EventQueue$3.run(EventQueue.java:680) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDo 
main.java:76) 
     at java.awt.EventQueue.dispatchEvent(EventQueue.java:691) 
     at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThre 
ad.java:244) 
     at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread. 
java:163) 
     at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThre 
ad.java:151) 
     at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147) 

     at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139) 

     at java.awt.EventDispatchThread.run(EventDispatchThread.java:97) 
java.sql.SQLException: java.lang.ArrayIndexOutOfBoundsException: 1 java.lang.Arr 
ayIndexOutOfBoundsException: 1 
     at org.hsqldb.jdbc.Util.sqlException(Unknown Source) 
     at org.hsqldb.jdbc.Util.sqlException(Unknown Source) 
     at org.hsqldb.jdbc.JDBCStatement.fetchResult(Unknown Source) 
     at org.hsqldb.jdbc.JDBCStatement.execute(Unknown Source) 
     at org.hsqldb.util.DatabaseManagerSwing.executeSQL(Unknown Source) 
     at org.hsqldb.util.DatabaseManagerSwing.access$1000(Unknown Source) 
     at org.hsqldb.util.DatabaseManagerSwing$StatementExecRunnable.run(Unknow 
n Source) 
     at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251) 
     at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:721) 
     at java.awt.EventQueue.access$200(EventQueue.java:103) 
     at java.awt.EventQueue$3.run(EventQueue.java:682) 
     at java.awt.EventQueue$3.run(EventQueue.java:680) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDo 
main.java:76) 
     at java.awt.EventQueue.dispatchEvent(EventQueue.java:691) 
     at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThre 
ad.java:244) 
     at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread. 
java:163) 
     at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThre 
ad.java:151) 
     at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147) 

     at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139) 

     at java.awt.EventDispatchThread.run(EventDispatchThread.java:97) 

更新2:

OK家伙,

我试用了一下,现在我知道,当我不创建改变表时,我可以很容易地插入字段...

+0

您应该包括*全*的你的堆栈跟踪 - 不只是消息。另外,告诉我们你正在使用的是哪个版本的hsqldb。也许这是一个已经修复的错误。 –

+1

你的'电影'桌子在哪里? –

+0

好吧,我更新了我的帖子... – maximus

回答

1

该声明有错误,应由HSQLDB拒绝。

alter table playlistmovies 
add constraint fk_plm_playlist 
foreign key (pid, mid) references playlist(id) -- mistake, FK has two columns, PK has one column 
on delete cascade; 

它被接受,但后来,当您尝试插入值,原来的错误导致异常(更新:此问题已被固定在HSQLDB 2.3.0,它拒绝原始语句)。

你不能有一个FK上的两列引用的是只有一列

您可以添加ON DELETE CASCADE原来的CREATE TABLE一个PK

CREATE TABLE PlaylistMovies(
mid INTEGER FOREIGN KEY REFERENCES Movie(movieid) ON DELETE CASCADE, 
pid INTEGER FOREIGN KEY REFERENCES Playlist(id) ON DELETE CASCADE,  
PRIMARY KEY (mid, pid) 
); 
+0

对于这个问题,可能的解决方案是什么? – maximus

+0

只是不要像这样使用ALTER TABLE。当问题得到解决后,你的陈述就会抛出异常。您已经将FK定义为参考播放列表(ID),没有其他必要了。我编辑了答案,并将ON DELETE CASCADE添加到CREATE TABLE。 – fredt

+0

但后来我失去了不能通过使用级联删除。是否有在hsqldb中使用删除级联的可能解决方案? – maximus