我需要實作一個簡單地清除資料庫中除少數表之外的所有資料的函式。鑒于到目前為止代碼的撰寫方式,這樣做比實作一個實際洗掉整個資料庫檔案并創建一個新檔案的外部函式要容易。
我想在一個準備好的陳述句上執行此操作,這樣我就可以通過擁有多個陳述句并按順序執行它們來避免代碼膨脹。我還想在單個事務中使用begin并commit以防萬一。我嘗試的是這樣的:
begin;
DELETE FROM dataTable;
DELETE FROM cacheTable;
DELETE FROM someOtherTable;
commit;
在 DBeaver 中運行它,不僅它不起作用,它實際上以某種方式使資料庫保持打開狀態,從我第二次嘗試的這個錯誤來看:
SQL Error [1]: [SQLITE_ERROR] SQL error or missing database (cannot start a transaction within a transaction)
我相信正在發生的只是第一行被執行,分號后的所有內容都被忽略了。
這可以在一個宣告中完成嗎?
uj5u.com熱心網友回復:
我想在一個準備好的陳述句上執行此操作,這樣我就可以通過擁有多個陳述句并按順序執行它們來避免代碼膨脹。
每個都必須是一個單一的宣告(除非....)。
但是,如果您想通過單個陳述句進行操作,那么雖然有點復雜,但您可以使用 TRIGGER,它可以在單個事務中執行多個陳述句(有限制)。
我還想在單個事務中使用 begin 和 commit 以防萬一。
如果您使用單個陳述句,那么它始終是單個事務,不需要 BEGIN .... COMMIT。
如果您采用 TRIGGER 路線,那么這里有一個示例/演示。
- 需要觸發 TRIGGER,因此您可以專門為此使用一個表(使用其他表可能會導致意外觸發)。
- 下面的示例/演示使用了這樣一個表,即triggerTable。
- 它通常是空的(由觸發器與其他表一起清除)。
- 由于 TRIGGER 是 AFTER INSERT 觸發器(根據演示),將一行插入到triggerTable會啟動其他表以及 triggerTable 的清除。
- 應該有最小的開銷,插入行的實際插入和隨后洗掉的時間非常少,并且可能只是表的 1(4k 額外存盤)頁面。
也許考慮以下示例/演示:-
/* Prepare Testing Environment */
CREATE TABLE IF NOT EXISTS dataTable (x);
CREATE TABLE IF NOT EXISTS cacheTable (y);
CREATE TABLE IF NOT EXISTS someOtherTable(z);
/* triggerTable could be another table */
CREATE TABLE IF NOT EXISTS triggerTable(id INTEGER PRIMARY KEY);
DROP TRIGGER IF EXISTS trigger_deletions;
/* The Trigger that will do the deletions in a single transaction */
CREATE TRIGGER IF NOT EXISTS trigger_deleteions AFTER INSERT ON triggerTable
BEGIN
DELETE FROM dataTable;
DELETE FROM cacheTable;
DELETE FROM someOtherTable;
DELETE FROM triggerTable; /* if triggerTable used */
END
;
/* Load some data */
INSERT INTO dataTable VALUES (1),(2),(3);
INSERT INTO cacheTable VALUES (1),(2),(3);
INSERT INTO someOtherTable VALUES (1),(2),(3);
/* Show the before test data PLUS trailer just in case nothing selected */
SELECT 'DT',* FROM dataTable UNION ALL SELECT 'CT',* FROM cacheTable UNION ALL SELECT 'SOT',* FROM someOtherTable UNION ALL SELECT 'trailer','trailer';
/* Initiate the Deletions */
INSERT INTO triggerTable VALUES(1);
/* Show the after test data PLUS trailer just as no data to select */
SELECT 'DT',* FROM dataTable UNION ALL SELECT 'CT',* FROM cacheTable UNION ALL SELECT 'SOT',* FROM someOtherTable UNION ALL SELECT 'trailer','trailer';
/* show the state of the trigger table */
SELECT * FROM triggerTable;
/* CleanUp Testing Environment */
DROP TABLE IF EXISTS dataTable;
DROP TABLE IF EXISTS cacheTable;
DROP TABLE IF EXISTS someOtherTable;
在 DBeaver 中運行它,不僅它不起作用,它實際上以某種方式使資料庫保持打開狀態,從我第二次嘗試的這個錯誤來看:
您是在執行腳本
而不是執行陳述句
嗎?
使用 DBeaver 使用上述結果:-

轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/410107.html
標籤:
上一篇:如何過濾NTILE視窗函式?
下一篇:濫用聚合函式avg()
