SQL-在插入期间依赖服务器错误

托马尔拉

我正在使用PostgreSQL 9.1。假设我有一个表,其中某些列具有UNIQUE约束。最简单的例子:

CREATE TABLE test (
    value INTEGER NOT NULL UNIQUE
);

现在,当插入一些值时,我不得不单独处理要插入的值已经存在于表中的情况。我有两个选择:

  • 做一个SELECT事先保证了量值不表,或:
  • 执行INSERT和观察服务器可能返回的任何错误。

利用PostgreSQL数据库的应用程序是用Ruby编写的。这是我编写第二个选项的方法:

require 'pg'

db = PG.connect(...)

begin
    db.exec('INSERT INTO test VALUES (66)')
rescue PG::UniqueViolation
    # ... the values are already in the table
else
    # ... the values were brand new
end

db.close

这是我的想法:假设我们SELECT在插入之前先做一个SQL引擎必须扫描行并返回任何匹配的元组。如果不存在,我们将INSERT进行一次扫描,然后再进行一次扫描,以查看是否UNIQUE不会有任何机会违反约束。因此,从理论上讲,第二种选择将使执行速度提高50%。这是PostgreSQL实际的行为方式吗?

我们假设在异常本身方面没有歧义(例如,我们只有一个UNIQUE约束)。

这是常见的做法吗?还是有什么需要注意的地方?还有其他选择吗?

托梅茨基

这取决于-如果您的应用程序用户界面通常允许输入重复的值,那么强烈建议您在插入之前进行检查。因为任何错误都会使当前事务无效,消耗序列/序列值,并用错误消息填充日志等。

但是,如果您的UI不允许重复,并且只有在有人使用技巧(例如在漏洞研究期间)或高度不可能的情况下才可以插入重复项,那么我将允许插入而无需先检查。

由于唯一约束会强制创建索引,因此此检查并不慢。但是绝对比插入和检查罕见错误要慢一些。Postgres 9.5将具有on conflict do nothingsupport,这将既快速又安全。您需要检查插入的行数以检测重复项。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

SQL Server,当插入到Excel“链接的服务器”时出现“无效的列名”错误

来自分类Dev

SQL Server脚本服务器错误

来自分类Dev

SQL 服务器合并错误

来自分类Dev

SQL 查询的内部服务器错误

来自分类Dev

在查询中从MS-SQL服务器插入毫秒

来自分类Dev

SQL语法错误还是服务器错误?

来自分类Dev

SQL 错误 26 错误定位指定的服务器/实例

来自分类Dev

Sql 服务器插入请求是否等待插入触发器完成?

来自分类Dev

从一台sql服务器到另一台sql服务器的数据插入

来自分类Dev

从一台sql服务器到另一台sql服务器的数据插入

来自分类Dev

插入期间HIbernate语法SQL错误

来自分类Dev

SQL Server未捕获链接服务器超时错误

来自分类Dev

SQL Server链接服务器查询错误

来自分类Dev

MS SQL服务器管理,错误编辑行

来自分类Dev

电子邮件服务器Ubuntu SQL错误

来自分类Dev

接近限制的休眠分页错误 - SQL 服务器

来自分类Dev

SQL服务器错误(提供程序:SQL网络接口,错误:26-指定服务器/实例时出错)

来自分类Dev

在SQL查询期间或在服务器端解析结果文本

来自分类Dev

更新SQL服务器

来自分类Dev

服务器控制SQL

来自分类Dev

sql服务器回合

来自分类Dev

Microsoft SQL服务器

来自分类Dev

SQL 服务器 -- 年

来自分类Dev

两台服务器之间的 SQL 代理作业依赖关系

来自分类Dev

SQL Server 2012-使用openquery插入链接服务器表

来自分类Dev

为什么每个临时表插入一个I / O?sql服务器

来自分类Dev

如何在ms-sql服务器中插入韩文文本?

来自分类Dev

如何在MS sql服务器记录中呈现和插入字母行?

来自分类Dev

如何在SQL Server中执行跨服务器插入?

Related 相关文章

热门标签

归档