2012-05-24 35 views
5

tôi cần phải chuẩn bị một kích hoạt SQLite cho điều kiện sau đây -thực Conditional sau một kích hoạt xóa trong SQLite

  1. Có ba bảng - retail_store, wholesale_store và sản phẩm
  2. Bàn retail_store và wholesale_store có cột product_id từ bảng product

Bây giờ tôi muốn viết trình kích hoạt xóa để nếu sản phẩm bị xóa khỏi retail_store và nếu sản phẩm không nằm trong bảng wholesale_store, thì bản ghi sản phẩm đó sẽ bị xóa khỏi bảng sản phẩm.

** Tôi hiểu là thực tế, có thể bạn không nên xóa một bản ghi sản phẩm như thế này. Vui lòng chỉ đặt câu hỏi này dưới dạng biến chứng kỹ thuật.

Cảm ơn bạn đã cân nhắc điều này. Chúc mừng!

Trả lời

8

Có lẽ chính khách sql sau đây là hữu ích cho bạn, nhưng tôi không thể đảm bảo với cú pháp là đúng.

CREATE TRIGGER after_retail_store_delete after delete ON retail_store 
    WHEN ((select count() from wholesale_store where productid = OLD.id) = 0) 
    BEGIN 
     DELETE FROM product WHERE productid = OLD.id ; 
    END ; 
+0

TUYỆT VỜI wenhm !!! Nó hoạt động hoàn hảo. Tôi vừa sửa đổi truy vấn xóa vì tên bảng phải là sản phẩm. Tôi không thể tin nổi tại sao danh tiếng của bạn xuất hiện chỉ là '1' trong khi trả lời câu hỏi này. –

1

Có vẻ như bạn không thực sự cần kích hoạt. Tôi sẽ xem xét việc sử dụng xóa tầng. Bạn đang sử dụng các phím nước ngoài? Check this out:

ON DELETE và ON hành động CẬP NHẬT gắn liền với mỗi khóa ngoại trong một cơ sở dữ liệu SQLite là một trong những "KHÔNG HÀNH ĐỘNG", "hạn chế", "SET NULL", "SET DEFAULT" hoặc "CASCADE". Nếu một hành động không được chỉ định rõ ràng, nó mặc định là "KHÔNG CÓ HÀNH ĐỘNG".

KHÔNG HÀNH ĐỘNG: Định cấu hình "KHÔNG HÀNH ĐỘNG" có nghĩa là: khi khóa cha được sửa đổi hoặc xóa khỏi cơ sở dữ liệu, không có hành động đặc biệt nào được thực hiện.

GIỚI HẠN: Các "hạn chế" hành động có nghĩa là các ứng dụng là cấm xóa (ví ON DELETE GIỚI HẠN) hoặc sửa đổi (ví ON CẬP NHẬT GIỚI HẠN) một chìa khóa phụ huynh khi có tồn tại một hoặc nhiều phím con ánh xạ tới nó . Sự khác biệt giữa hiệu lực của hành động RESTRICT và thực thi hạn chế khóa ngoài thông thường là RESTRICT xử lý hành động xảy ra ngay sau khi trường được cập nhật - không phải tại số kết thúc câu lệnh hiện tại vì nó có ràng buộc ngay lập tức, hoặc vào cuối giao dịch hiện tại vì giao dịch đó có hạn chế bị trì hoãn. Ngay cả khi ràng buộc khóa ngoài được gắn vào là trì hoãn, việc định cấu hình hành động RESTRICT khiến SQLite trả về lỗi ngay lập tức nếu khóa cha có khóa con phụ thuộc bị xóa hoặc sửa đổi.

SET NULL: Nếu hành động được định cấu hình là "SET NULL", thì khi khóa cha bị xóa (cho ON DELETE SET NULL) hoặc sửa đổi (cho ON UPDATE SET NULL), cột khóa con của tất cả các hàng trong bảng con rằng ánh xạ tới khóa chính được đặt để chứa các giá trị SQL NULL.

SET DEFAULT: Hành động "SET DEFAULT" tương tự như "SET NULL", ngoại trừ mỗi cột khóa con được đặt để chứa giá trị mặc định của cột thay vì NULL. Tham khảo tài liệu CREATE TABLE để biết chi tiết về cách các giá trị mặc định được gán cho bảng cột.

CASCADE: Hành động "CASCADE" truyền bá thao tác xóa hoặc cập nhật trên khóa chính cho mỗi khóa con phụ thuộc. Đối với hành động "BẬT DELETE CASCADE", điều này có nghĩa là mỗi hàng trong bảng con là được liên kết với hàng gốc bị xóa cũng bị xóa. Đối với hành động "ON CẬP NHẬT CASCADE", điều đó có nghĩa là các giá trị được lưu trữ trong mỗi khóa con phụ thuộc được sửa đổi để khớp với các giá trị khóa chính mới.

đọc thêm ở đây: http://www.sqlite.org/foreignkeys.html#fk_actions

+0

Cảm ơn Jason. Có một vấn đề mặc dù. Như tôi đã chỉ định sản phẩm chỉ nên bị xóa khỏi sản phẩm bảng CHỈ NẾU hồ sơ sản phẩm không tồn tại trong bảng wholesale_store. Điều quan trọng là phải hiểu rằng thao tác này cũng giống như nếu bạn xóa một bản ghi con, sau đó xóa bản ghi cha quá, nếu bản ghi con không tồn tại trong bất kỳ bảng nào khác. –

Các vấn đề liên quan