2
我有一個例外,以防止在我的oracle上插入相同的記錄。如何檢查表是否有主鍵值的記錄?
如果具有特定Key值的記錄已經存在,則必須啓用記錄插入接口。
我聽說COUNT(*)有很多我不想使用的成本。
是否有任何其他方式使其至少成本?
我有一個例外,以防止在我的oracle上插入相同的記錄。如何檢查表是否有主鍵值的記錄?
如果具有特定Key值的記錄已經存在,則必須啓用記錄插入接口。
我聽說COUNT(*)有很多我不想使用的成本。
是否有任何其他方式使其至少成本?
有兩種選擇
BEGIN
INSERT INTO table (pk_col, col_a, col_b) VALUES (:pk, :col_a, :col_b);
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
UPDATE table SET col_a = :col_a, col_b = :col_b WHERE pk_col = :pk;
END;
或
BEGIN
UPDATE table SET col_a = :col_a, col_b = :col_b WHERE pk_col = :pk;
IF SQL%ROWCOUNT = 0 THEN
INSERT INTO table (pk_col, col_a, col_b) VALUES (:pk, :col_a, :col_b);
END IF;
END;
我展示了一個PL/SQL代碼片斷,因爲你沒有指定客戶端語言(如PHP,Python的... )。您可能會以不同方式處理異常和/或檢查SQL%ROWCOUNT。
+1但是,第二個選項不是100%可靠 - 如果2個會話嘗試同時插入相同的鍵值,它可能會因主鍵違例而失敗。 – 2010-06-02 08:32:58
我正在處理JAVA/JSP,我應該檢查它然後應用程序將使按鈕禁用插入一條記錄 – KIM 2010-06-04 05:30:02