在Postgresql中,如何根据列值相同或不相同的情况插入到表中

在Postgresql中,如何根据列值相同或不相同的情况插入到表中,sql,postgresql,Sql,Postgresql,我正在向表中插入数据,如下所示 | num | name | value | ---------------------------------- | 1 | name1 | 1 | | 2 | name2 | 1 | | 3 | name3 | 1 | | 4 | name4 | 2 | | 5 | name5 | 3 | 我想插入wh

我正在向表中插入数据,如下所示

|   num   | name     |  value |
----------------------------------
|    1    | name1    |   1    |
|    2    | name2    |   1    |
|    3    | name3    |   1    |
|    4    | name4    |   2    |
|    5    | name5    |   3    |
我想插入where子句,比如insert into table num,name,value 6,name,1,当num和value一起不存在于任何一行中时

我试图根据结果选择first和insert,但我认为这不是我希望在单个查询中使用的最佳方式

尝试如下:从name=$name和value=$value的表中选择*如果我得到结果,则不插入,否则插入。它是通过两个查询完成的,但我不想要它


将通知任何帮助。

使用唯一约束强制num、value的唯一性:

然后,数据库确保表的完整性—这些值是唯一的。你不必明确地这样做


请注意,如果违反了unique约束,则会出现错误,插入操作将与可能插入的其他行一起中止。如果您想忽略错误,可以使用on conflict ignore。

基本上,首先需要检查表中是否已经存在具有相同num和值的记录。如果存在,则不插入其他项插入新记录

为此,您可以尝试使用以下步骤插入值:

EXEC dbo.InsertRecVali(1,'abc',6)
以下程序将根据您的需要提供帮助:

create procedure InsertRecVali(@num int,@name varchar(max),@value int)

as 

begin

if not exist(select 1 from table where num=@num and value=@value)

insert into table values(@num,@name,@value)

Else 

PRINT 'Cannot Insert Duplicate Value'

End;
创建过程后,通过传递要插入到表中的值来执行此过程

所以,在表中插入记录之前,它将检查表中是否已经存在具有相同num和值的记录,然后它将不插入该记录,并给出错误“无法插入重复值”

否则,如果表中不存在具有相同num和值的记录,则只有它将在表中插入记录

以下是执行此过程的示例:

EXEC dbo.InsertRecVali(1,'abc',6)

如果尝试插入并破坏它们的唯一性会怎么样。其他没有唯一值的行将被插入或不被插入,如果有错误,我如何才能获得插入id我想要一个简单的查询而不具有唯一性,你能告诉我@Gordon吗Linoff@bala . . . 正如答案中所指出的,您可以使用on conflict忽略错误。。。。autoincrement增加了它是否插入。我的意思是,在不插入但自动增量增加@Gordon Linoff的冲突中,除了应该用a完成这一事实之外,这个特定的存储过程是一个竞争条件,将导致在高负载下插入。也就是说,如果是SQL Server,它会的,但是OP询问PostgreSQL,这种语法在哪里不起作用。