创建将数据插入两个现有表的 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的主要内容,如果未能解决你的问题,请参考以下文章