创建将数据插入两个现有表的 SQL FUNCTION

Posted

技术标签:

【中文标题】创建将数据插入两个现有表的 SQL FUNCTION【英文标题】:Creating an SQL FUNCTION that inserts data into two existing tables 【发布时间】:2020-06-05 03:01:01 【问题描述】:

我正在尝试创建一个将完整且相关的信息插入现有表的函数。我需要 FUNCTION 来检查某些实体是否存在于另一个表中,如果不存在,则插入数据。示例代码如下:

CREATE FUNCTION insert_payment (customer_uuid uuid, customer_name varchar(63), payment_uuid uuid, total_amount integer

假设我想在一个名为 Payments 的表中输入一笔付款。我希望 FUNCTION 检查另一个名为 Customers 的现有表,以查看表中是否已经存在 customer_uuid 和 customer_name。如果没有,我希望 FUNCTION 将 customer_uuid 和 customer_name 信息插入到客户中,并将所有四个参数的数据输入到付款中。

这是我在 Stack Overflow 上提出的第一个问题,如果需要进一步说明,请告诉我。我也是一名学生,在谈论编码时仍在学习如何有效地沟通,因此,如果需要进一步澄清,我会尽力而为。谢谢!

【问题讨论】:

【参考方案1】:

您可以使用insert on conflict do nothing 插入客户,如果已存在则跳过插入。

所以用这个表定义:

create table customer (id uuid primary key, name text);
create table payment (id uuid primary key, customer_id uuid not null references customer, amount integer);

这个函数会做你想做的:

CREATE FUNCTION insert_payment (customer_uuid uuid, customer_name varchar(63), 
                                payment_uuid uuid, total_amount integer)
  returns void
as
$$
  insert into customer (id, name) 
  values (customer_uuid, customer_name)
  on conflict do nothing;

  insert into payment (id, customer_id, amount)
  values (payment_uuid, customer_uuid, total_amount);
$$
language sql;

这与在插入之前首先检查是否存在 (select exists (...)) 一样有效,因为无论如何 INSERT 语句都会执行该检查。

Online demo

【讨论】:

我已经使用 pgAdmin 4 输入了这个确切的代码,我收到了一个语法错误:“冲突时什么都不做;”。错误处于或接近“ON”。有什么想法吗? 那么您可能会使用不受支持的 Postgres 版本。 select version(); 带给你什么? PostgreSQL 9.2.24 on x86_64-koji-linux-gnu,由 gcc (GCC) 7.3.1 20180303 (Red Hat 7.3.1-5) 编译,64 位 Postgres 9.2 是 no longer supported 和 on conflict () 是在 9.5 中引入的(这也将在 6 个月内结束)【参考方案2】:

知道您的表格字段名称后,我可以为您提供更多帮助,但在这里我分享一个代码,也许它会对您有所帮助

//set variable
$customer_uuid= $_POST['customer_uuid'];
$customer_name= $_POST['customer_name'];

//WRITE QUERY to the check-in customers table

$duplicate_customer = $this->db->prepare( "SELECT customer_uuid,customer_name FROM customers WHERE customer_uuid = '$customer_uuid' AND customer_name='customer_name'" );        $duplicate_customer->execute();

//now check data if exist in the customer table

if($duplicate_customer->rowCount() > 0)
           //write here insert query to insert data in customer table

【讨论】:

那是 php,不是 SQL 函数

以上是关于创建将数据插入两个现有表的 SQL FUNCTION的主要内容,如果未能解决你的问题,请参考以下文章

如何将文件表与SQL Server中的现有表链接

将数据框从 R 插入 SQL 的有效方法

怎么用SQL语句同步两个表中的字段值?

如何在现有表的中间插入新的数据库记录?

如何用SQL语句删除两个表中相同的记录?

将两个输入分配给 SQL 表的单个列