PostgreSQL 更新插入 PostgreSQL 标识列 PostgreSQL 子查询 PostgreSQL 更新插入 在本节中,我们将了解PostgreSQL upsert属性的工作,该属性用于插入或修改数据,如果正在插入的行已经存在并且在冲突命令的帮助下插入表中。 在 RDBMS(关系数据库管理系统)中,术语 upsert 被称为合并。当我们向特定表中插入新行时,如果该行已经存在,PostgreSQL 将升级该行,否则,它将添加新行。而这个过程被称为 upsert,它是insert或update 命令的组合。 在PostgreSQL 中,以下查询用于使用INSERT ON CONFLICT命令更新表: INSERT INTO table_name(column_list) VALUES(value_list) ON CONFLICT target action; tgreSQL在 INSERT 命令中添加了ON CONFLICT 目标操作子句。 在上面的命令中,Conflict_target可以是以下之一: Target description column_name 它用于指定特定表中的列名。 ON CONSTRAINT constraint_ name 在这种情况下,约束名称可以是 UNIQUE 约束的名称。 WHERE predicate 带有谓词的 WHERE 子句。 在上面的命令中,Conflict_action可以是以下之一: Actions Description DO NOTHING 它定义了如果行已经出现在表中,我们什么都不做。 DO UPDATE SET column_1 = value_1, .. WHERE condition 此操作用于更新表中的某些字段。 注意:如果我们使用的是较早版本的 PostgreSQL,我们将需要一种解决方法来拥有 upsert 功能,因为 ON CONFLICT 子句只能从 PostgreSQL 9.5 访问。版本。 PostgreSQL upsert 功能示例 要实时了解 PostgreSQL Upsert 功能的工作,我们需要遵循以下过程: 首先,我们将在下面的 Create 命令的帮助下创建一个名为customers的新表,如下所示: CREATE TABLE officers ( officers_id serial PRIMARY KEY, officers_name VARCHAR UNIQUE, officers_email VARCHAR NOT NULL, Officers_address VARCHAR NOT NULL ); 输出 一旦我们实现了上面的查询,我们将得到下面的消息窗口;该官员\表已成功创建。 Officers\表包含四列,例如officers_id, officers_name, officers_email, and officers_address. 并确保有关人员的名字唯一性,我们使用了唯一约束的officers_name列。 完成创建Officers\表后,我们将使用 INSERT 命令向其中插入一些数据。 INSERT INTO officers VALUES (101,'Denny', 'denny11@hotmail.com','Newyork'), (102,'John', 'john23@gmail.com','Boston'), (103,'Olivia', 'olivia22@gmail.com','Newyork'), (104,'Mike', 'mike34@gmail.com','Newyork'); 输出 一旦我们实现了上面的查询,我们将得到下面的消息窗口;这些值已成功插入到官员\表中。 让我们假设其中一位官员想要将他们的地址Newyork更改为 Florida,因此我们可以在 UPDATE 命令的帮助下对其进行修改。 我们使用下面的INSERT ON CONFLICT命令来描述 upsert 功能: INSERT INTO officers (officers_name, officers_addrerss ) VALUES('Olivia','Florida') ON CONFLICT ON CONSTRAINT officers_name DO NOTHING; 上面的命令定义,如果officers_name出现在军官表,什么事都不做或者干脆忽略它。 下面的命令与上面的命令类似,但由于INSERT命令的目标,它使用官员_名称列代替唯一约束官员_名称。 INSERT INTO officers VALUES(102,'Olivia','olivia22@gmail.com','Florida') ON CONFLICT (officers_name) DO NOTHING; 输出 执行上述命令后,我们将得到以下消息窗口,其中显示INSERT 0 0,这意味着DO-NOTHING操作将返回INSERT 0 0以表示冲突。因此,插入命令成功,并没有插入任何行。 让我们假设我们希望将结合新officers_address与老officers_address插入时,官员中已经存在。 在下面的命令中,我们使用 UPDATE 子句作为INSERT 命令的操作: INSERT INTO officers VALUES(102,'Olivia','olivia22@gmail.com','Florida') ON CONFLICT (officers_name) DO UPDATE SET officers_address = EXCLUDED.officers_address || ',' || officers.officers_address; 输出 执行上述查询后,我们将得到以下消息窗口;这些values已成功更新到officers\表中。 要检查上述 upsert 功能是否正常工作,我们将使用select 命令,如下面的命令所示: 从官员中选择*; 输出 执行上述命令后,我们将得到以下输出: PostgreSQL 标识列 PostgreSQL 子查询