Tôi hiện đang cố gắng tạo cơ sở dữ liệu sqlite nơi tôi có thể nhập bảng từ cơ sở dữ liệu sqlite khác (không thể đính kèm) và thêm một số dữ liệu bổ sung vào mỗi cột.INSERT HOẶC THAY THẾ + khoá ngoại ON DELETE CASCADE làm việc quá tốt
vì không có INSERT OR UPDATE
tôi đến với điều này:
Tôi đã suy nghĩ về việc tách các dữ liệu vào hai bảng và tham gia cùng họ sau đó vì vậy tôi chỉ có thể đổ toàn bộ nhập khẩu vào một bảng thay thế tất cả những gì đã thay đổi và quản lý thêm dữ liệu riêng biệt vì điều đó không thay đổi khi nhập.
Các bảng đầu tiên (chúng ta hãy gọi nó base_data
) sẽ trông như thế
local_id | remote_id | base_data1 | base_data2 | ...
---------+-----------+------------+------------+----
bên cạnh những local_id
tất cả mọi thứ sẽ chỉ được một tấm gương của cơ sở dữ liệu từ xa (tôi có lẽ sẽ thêm một dấu thời gian đồng bộ nhưng điều đó không thành vấn đề hiện nay).
Bảng thứ hai sẽ trông tương tự nhưng có remote_id
bộ như nước ngoài chủ chốt
remote_id | extra_data1 | extra_data2 | ...
----------+-------------+-------------+----
CREATE TABLE extra_data (
remote_id INTEGER
REFERENCES base_data(remote_id)
ON DELETE CASCADE ON UPDATE CASCADE
DEFERRABLE INITIALLY DEFERRED,
extra_data1 TEXT,
extra_data2 TEXT,
/* etc */
)
Bây giờ ý tưởng của tôi là chỉ đơn giản là INSERT OR REPLACE INTO base_data ...
giá trị vì cơ sở dữ liệu tôi nhập khẩu từ không có dấu thời gian đồng bộ hoặc bất cứ điều gì và tôi sẽ phải so sánh tất cả mọi thứ để tìm ra những gì hàng tôi phải UPDATE
/những gì để INSERT
.
Nhưng ở đây nằm vấn đề: INSERT OR REPLACE
thực sự là một DELETE
tiếp theo là một INSERT
và phần xóa kích hoạt ngoại khóa ON DELETE
mà tôi nghĩ tôi có thể ngăn ngừa bằng cách làm cho chế DEFERRED
. Nó không hoạt động nếu tôi quấn INSERT OR REPLACE
trong một giao dịch. Nó luôn xóa dữ liệu phụ của tôi mặc dù cùng một khóa ngoại tồn tại sau câu lệnh.
Có thể dừng ON DELETE
để kích hoạt cho đến khi INSERT OR REPLACE
kết thúc? Có lẽ một số chế độ giao dịch đặc biệt/pragma?