我想將一堆記錄從臨時表複製到目標表。問題是有些記錄可能違反目標表中的檢查約束條件,所以我想插入一切可能的內容,並在其他地方爲無效記錄生成錯誤日誌。如何根據Firebird/Interbase中的檢查約束在表間複製記錄?
如果我執行:如果任何記錄違反任何約束
INSERT INTO target_table
SELECT ... FROM temp_table
什麼都不會被插入。我可以做一個循環並手動插入一個,但我認爲性能會更低。
我想將一堆記錄從臨時表複製到目標表。問題是有些記錄可能違反目標表中的檢查約束條件,所以我想插入一切可能的內容,並在其他地方爲無效記錄生成錯誤日誌。如何根據Firebird/Interbase中的檢查約束在表間複製記錄?
如果我執行:如果任何記錄違反任何約束
INSERT INTO target_table
SELECT ... FROM temp_table
什麼都不會被插入。我可以做一個循環並手動插入一個,但我認爲性能會更低。
像這樣:
INSERT INTO
some_table1 (fld1, fld2, fld3)
SELECT
some_table2.fld1,
some_table2.fld2,
some_table2.fld3
FROM
some_table2
WHERE
some_table2.fld > 100
LIMIT
5;
你可以寫一個存儲過程,而copyes記錄和捕捉任何錯誤與WHEN ANY DO
語句,像
CREATE PROCEDURE CopyRecords(...)
AS
BEGIN
FOR select ... FROM temp_table INTO ... DO BEGIN
INSERT INTO target_table ...
WHEN ANY DO BEGIN
INSERT INTO ErrorLog(SQL_Code, GDS_Code, ...) VALUES(SQLCODE, GDSCODE, ...);
END
END
END
的WHEN ... DO
語句在InterBase 6.0 Language Reference記錄(滾動在頁面下方,IB 6文檔下載位於底部),位於「程序和觸發器」一章下。
除了做一個'INSERT ... SELECT .. WHERE <約束的所有條件>'我認爲這可能是唯一的方法。 – 2013-02-15 16:23:52