2012-01-05 7 views
8

có vẻ như ràng buộc khóa ngoại được hỗ trợ kể từ phiên bản 3.6.x trong SQLite. Phiên bản của SQLite trên IOS5.0 là 3.7.7 (được tìm thấy trong sqlite3.h).SQLite - Các ràng buộc khóa ngoại - IOs 5

Nhưng khi tôi cố chèn hàng vào bảng có ràng buộc, hàng của tôi được chèn chính xác ngay cả khi khóa ngoại có liên quan không tồn tại. Tôi không có lỗi.

Làm báo cáo kết quả chèn tương tự sử dụng các ứng dụng như Navicat mang lại cho tôi một "lỗi vi phạm ràng buộc"

Bạn có biết nếu các phím nước ngoài được hỗ trợ trên iOS 5?

Dưới đây là Schema Database:

CREATE TABLE artist(
    artistid INTEGER PRIMARY KEY, 
    artistname TEXT 
) 

CREATE TABLE "track" (
    "trackid" INTEGER PRIMARY KEY AUTOINCREMENT, 
    "trackname" TEXT, 
    "trackartist" INTEGER, 
    CONSTRAINT "trackartist" FOREIGN KEY ("trackartist") REFERENCES "artist" ("artistid") ON DELETE CASCADE ON UPDATE CASCADE) 

Thực sự đơn giản, phải không?

Cảm ơn Emmanuel

+0

Bạn có thể đăng mã nơi bạn đang chèn vào bàn? – Eric

+0

Xin chào, tôi đang sử dụng FMDatabase, mã thực sự đơn giản: [db executeUpdate: @ "chèn vào giá trị (trackname, trackartist) (?,?)", @ "new track", [NSNumber numberWithInt: i ]] – ecaste

+0

Lạ ... Tôi có cùng kịch bản giống với bạn ... (Navicat, iOS, FMDB). Cùng một vấn đề. Gotta yêu SO. – walkingbrad

Trả lời

13

Phím ngoài bị tắt theo mặc định. Bạn phải kích hoạt chúng một cách riêng biệt cho mỗi kết nối. Cài đặt không phải là "dính". Bạn phải làm điều này mỗi khi bạn kết nối với một cơ sở dữ liệu SQLite.

PRAGMA foreign_keys = ON; 

Tỷ lệ tốt là Navicat sẽ chăm sóc điều đó cho bạn. Trong mã của riêng bạn, đó là công việc của bạn.

+0

Thật tuyệt vời nhưng làm cách nào để tôi thực hiện việc này? Tôi chỉ thực hiện điều này với DB? Làm cách nào để sử dụng dòng mã PRAGMA Foreign_keys = ON' này? – Daniel

+0

@Daniel: Vâng, bạn thực hiện như thể nó là một câu lệnh SQL. [Chi tiết về giao diện C của SQLite] (http://www.sqlite.org/c3ref/prepare.html) –

+0

Cảm ơn, đã thiết lập và làm việc ngay bây giờ. cổ vũ – Daniel

4

Cuối cùng tôi đã tìm được giải pháp .... và yêu cầu bạn đã đúng.

Theo mặc định, cơ sở dữ liệu sqlite được mở bằng tùy chọn khóa ngoại được tắt, ngay cả khi các bảng đã được xây dựng với các ràng buộc khóa ngoài!

Vì vậy, chỉ thực hiện yêu cầu này rất đơn giản:

PRAGMA foreign_keys=ON; 

chỉ sau khi mở cơ sở dữ liệu, và ngoài một giao dịch (nếu bạn đang sử dụng fmdatabase và chức năng giao dịch)

Hy vọng điều này sẽ giúp người khác.

Emmanuel

2

Đây là cách tôi làm điều đó bằng FMDB:

[database executeUpdate:@"PRAGMA foreign_keys=ON"]; 
0

Đó là trên doc: SQLite Doc

và khi bạn mở kết nối:

[database executeUpdate:@"PRAGMA foreign_keys=ON"];