2012-12-10 3 views
1

현재 hsqldb를 사용 중입니다. 만들어 내 문은 같이 :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들,

내가 지금 조금 시도 나는 내가 필드를 쉽게 삽입 할 수있는 alter 테이블을 만들지 않을 때 ...

+0

당신은 *의 * 전체를 포함해야 스택 추적 - 메시지뿐 아니라 또한 사용중인 hsqldb의 버전을 알려주십시오. 아마도 이것은 수정 된 버그 일 것입니다. –

+1

'영화'테이블은 어디에 있습니까? –

+0

좋아요, 내 게시물을 업데이트했습니다 ... – maximus

답변

1

이 문은 오류가있어서 HSQLDB에 의해 거부되어야합니다. (:이 문제는 HSQLDB 2.3.0에서 수정되었습니다 및 원래 진술을 거부 갱신)

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; 

는 그것은 가능하지만 값을 삽입 할 때 이후, 원래의 오류는 예외가 발생됩니다.

당신은 당신은 ON이 표를 CREATE 원본에 CASCADE 삭제 추가 할 수 있습니다

하나의 열이있는 PK를 참조하는 두 개의 열 상에 FK를 가질 수 없습니다

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을 사용하지 마십시오. 문제가 해결되면 명령문에서 예외가 발생합니다. 이미 재생 목록 (id)을 참조하도록 FK를 정의했으며 더 이상 필요하지 않습니다. 나는 대답을 편집하고 ON DELETE CASCADE를 CREATE TABLE에 추가했다. – fredt

+0

하지만 캐스케이드를 사용하여 삭제할 수 없습니다. hsqldb에서 delete cascade를 사용할 수 있습니까? – maximus