首先,我不是一個計數器列到Main
表添加。我將創建一個單獨的Audit
表,該表將保存來自Main
表的項目的ID
以及當請求該ID
時至少添加時間戳。實質上,Audit
表將存儲請求的歷史記錄。在這種方法中,您可以輕鬆生成更多有趣的報告。您可以隨時計算每件商品的總計總額,並且還可以按日期,星期,月份等計算每件商品或所有商品的彙總。根據數據量的不同,您可以定期刪除比某個閾值(一個月,一年等)更早的審計條目。
此外,您可以根據需要輕鬆地在Audit
表中存儲更多信息,例如用戶ID來計算每個用戶的統計信息。
要自動填充Audit
表我會創建一個存儲過程。客戶端代碼將調用此存儲過程,而不是執行原始的SELECT
。存儲過程將返回與原始SELECT
完全相同的結果,但也會向客戶端代碼透明地向Audit
表添加必要的詳細信息。
所以,讓我們假設Audit
表看起來像這樣:
CREATE TABLE AuditTable
(
ID int
IDENTITY -- SQL Server
SERIAL -- Postgres
AUTO_INCREMENT -- MySQL
NOT NULL,
ItemID int NOT NULL,
RequestDateTime datetime NOT NULL
)
和你的主SELECT
看起來是這樣的:
SELECT ItemID, Col1, Col2, ...
FROM MainTable
WHERE <complex criteria>
要在一個語句在SQL Server中我同時執行INSERT
和SELECT
'd使用OUTPUT
子句,在Postgres - RETURNING
子句中,在MySQL中?我不認爲它有這樣的事情。所以,MySQL程序會有幾個單獨的語句。
MySQL的
起初做你SELECT
並插入結果爲temporary(可能是內存)表。然後將臨時表中的物料ID複製到Audit
表中。然後從臨時表中將SELECT
返回給客戶端。
CREATE TEMPORARY TABLE TempTable
(
ItemID int NOT NULL,
Col1 ...,
Col2 ...,
...
)
ENGINE = MEMORY
SELECT ItemID, Col1, Col2, ...
FROM MainTable
WHERE <complex criteria>
;
INSERT INTO AuditTable (ItemID, RequestDateTime)
SELECT ItemID, NOW()
FROM TempTable;
SELECT ItemID, Col1, Col2, ...
FROM TempTable
ORDER BY ...;
SQL服務器(只是爲了逗你。這一個說法確實都INSERT
和SELECT
)
MERGE INTO AuditTable
USING
(
SELECT ItemID, Col1, Col2, ...
FROM MainTable
WHERE <complex criteria>
) AS Src
ON 1 = 0
WHEN NOT MATCHED BY TARGET THEN
INSERT
(ItemID, RequestDateTime)
VALUES
(Src.ItemID, GETDATE())
OUTPUT
Src.ItemID, Src.Col1, Src.Col2, ...
;
你可以離開Audit
表作爲它,或者你可以設置cron來概括它定期。這實際上取決於數據量。在我們的系統中,我們將單個行存儲一週,並且我們每小時彙總統計數據並保留6周,並且我們每日彙總18個月。但是,重要的是,所有這些總結都是獨立的Audit
表,我們不保留Main
表中的審計信息,所以我們不需要更新它。
喬·塞科在SQL Style Habits: Attack of the Skeuomorphs解釋非常好:
現在去任何SQL論壇文本搜索的帖子。您會發現有數千個包含DDL的帖子,其中包括名爲createdby
, createddate
,modifiedby
和modifieddate
的列,並且在行聲明結尾處包含該特定的 元數據。這是舊的磁帶 標題標籤用新的語言寫的! Deja Vu!
標題記錄只在磁帶上出現一次。但是,這些元數據 值在表格中的每一行都會反覆出現。使用數據庫(不僅僅是SQL)的主要原因之一是從數據中刪除冗餘 ;這只是增加了更多的冗餘。但現在想想 行被刪除時審計跟蹤會發生什麼?當行更新時,審計線索 會發生什麼變化?小道被毀壞。審計數據應與模式分離。你會把日誌 文件放在與數據庫相同的磁盤驅動器上嗎?會計師是否讓 同一個人批准並收到付款?
INSERT INTO mytable(col1,col2,col3 ...)SELECT col1,col2,col3 FROM anotherTable – bksi
該查詢是否會在最後返回SELECT語句的所有列?我只想將ID列插入到另一個表中,然後返回到同一個SELECT語句的所有其他列。那是INSERT INTO的工作原理嗎? – Ecksters
這是不可能與MySQL。你將不得不使用兩個查詢。 – rjdown