如何检查表是否有主键值的记录?
问题描述:
我有一个例外,以防止在我的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