2013-05-07 42 views
6

Cho một bảng trong schema gốc:cơ sở dữ liệu H2: đề cập đến một bảng trong schema gốc từ một ràng buộc khoá ngoại

CREATE TABLE user (
    username VARCHAR(50), 
    password VARCHAR(50)); 

và một bảng trong Quiz schema:

CREATE TABLE Quiz.Results (
    username VARCHAR(50), 
    points INT, 
    FOREIGN KEY (username) REFERENCES user(username)); 

Tôi không thể để thực sự tạo khóa ngoại, vì cơ sở dữ liệu tuyên bố bảng user không thực sự tồn tại. Sau đó tôi không thể thêm khoá ngoại:

ALTER TABLE QUIZ.RESULTS 
    ADD FOREIGN KEY (username) REFERENCES user (username) 

Cả hai bảng đều được lưu trữ trong cùng một cơ sở dữ liệu.

Vì đây chỉ là một phần bài tập về nhà, tôi rất vui khi chỉ đơn giản là bỏ qua thêm khóa ngoại. Nhưng tôi tò mò nếu điều này thực sự là một hạn chế trong H2, một lỗi, hoặc nếu nó hoạt động như dự định.

Tôi có thể tham khảo bảng user bên ngoài lược đồ quiz không?

Trả lời

14

Bạn cần đặt rõ ràng tên lược đồ nếu bạn tham chiếu đến bảng trong lược đồ khác. Tên lược đồ mặc định cho H2 là public. Ví dụ:

CREATE TABLE user (
    username VARCHAR(50), 
    password VARCHAR(50)); 
create schema quiz; 
CREATE TABLE Quiz.Results (
    username VARCHAR(50), 
    points INT, 
    FOREIGN KEY (username) 
    REFERENCES public.user(username)); 

Để tạo ràng buộc khoá ngoại sau, sử dụng:

ALTER TABLE QUIZ.RESULTS 
    ADD FOREIGN KEY (username) 
    REFERENCES public.user(username) ; 
+0

Biết được sơ đồ mặc định (những gì tôi gọi là 'schema root') tên giúp. Cảm ơn! –

+0

Tôi có thể hỏi tại sao bạn thêm 'NGOẠI TỆ (tên người dùng)' hai lần? Có vẻ như bạn thêm nó một lần trong định nghĩa bảng cho 'Quiz.Results', sau đó là lần thứ hai trong câu lệnh' ALTER TABLE' của bạn. –

+0

@CraigOtis Bạn nói đúng, nó phải là cái này hay cái kia. Tôi đã thay đổi câu trả lời. –

0

có rất nhiều càng tốt. Bạn cần phải sử dụng tên lược đồ tương ứng cho cả hai bảng.

giả tên schema defualt của bạn là DefaultSchema sau đó truy vấn của bạn sẽ được

ALTER TABLE QUIZ.RESULTS 
ADD FOREIGN KEY (username) REFERENCES DefaultSchema.user (username) 
Các vấn đề liên quan