【问题标题】:How can i update a row in postgresql?如何更新 postgresql 中的一行?
【发布时间】:2021-07-21 09:54:43
【问题描述】:

我有一个名为 person 的表,它看起来像这样:

CREATE TABLE public.person
(
"idPerson" integer NOT NULL DEFAULT nextval('idperson'::regclass),
fname character varying(45) COLLATE pg_catalog."default",
lname character varying(45) COLLATE pg_catalog."default",
sex character(1) COLLATE pg_catalog."default",
dateofbirth date,
address character varying(75) COLLATE pg_catalog."default",
city character varying(45) COLLATE pg_catalog."default",
country character varying(45) COLLATE pg_catalog."default",
CONSTRAINT "idPerson_PK" PRIMARY KEY ("idPerson")
)

我想通过一个函数执行更新( my_update_function(fname,lname , sex ,dateofbirth,address,city,country) 。我的问题是我不想要一个特定的条件,而是我只想调用这个函数比如这样:

SELECT my_update_function('Jamie','Phillips', 'F',1973-03-08,'Santina Island 108','Okhotsk',Russia)

并仅在不同的列中使用 idPerson 57 更新我的表(在本例中为 fname)

这就是我所做的:

        UPDATE person 
    SET fname=my_update_function.fname , lname=my_update_function.lname
        ,sex=my_update_function.sex , dateofbirth=my_update_function.dateofbirth
        ,address=my_update_function.address , city=my_update_function.city
        ,country=my_update_function.country
    WHERE person.fname='Karissa';

我更新了我的表格,但这里的问题是我必须将特定的 fname 'Karissa' 放在函数中,而不是我想自动完成。

我该怎么做?

谢谢。

【问题讨论】:

  • 在你想要的自动化函数中,Karissa这个名字是从哪里来的?
  • 找到要更新的记录的条件是什么?在 my_update_function 的示例中,您没有指定 idPerson。根据您的表定义,没有唯一的约束/索引来识别使用其他字段的记录。请解释函数my_update_function应该使用它接受的参数做什么。
  • @LaurenzAlbe 如果您查看上面的表格,您会看到一个名为 Karissa 的人。这只是尝试检查更新功能应该如何工作
  • @JuliusTuskenis 我被要求创建一个以 (fname,lname,sex,dateofbirth,address, city,country ) 作为输入参数的函数。据我所知,我应该调用 my_update_function 来进行我想要的更新。例如,如果我这样称呼它: my_update_function('Jamie','Phillips','F',1973-03-08,'Santina Island 108','Okhotsk',Russia) 应该找到我要更新的行和然后改变它。例如,我想更新姓名、性别和国家/地区,我想我的函数应该根据保持不变的其他参数找到我想要的人
  • @JuliusTuskenis 至于 idPerson 是主键,我的教授说我不应该在更新函数中使用它作为参数

标签: postgresql datatable sql-update


【解决方案1】:

也许你可以试试这样的东西

execute 'UPDATE person 
SET fname='||my_update_function.fname||' , lname='||my_update_function.lname||'
    ,sex='||my_update_function.sex||' , dateofbirth='||my_update_function.dateofbirth||'
    ,address='||my_update_function.address||' , city='||y_update_function.city||'
    ,country='||my_update_function.country||'
WHERE person.fname='''||my_update_function.fname||'''';

或者(更好,因为它不易受到 SQL 注入的攻击)

prepare query as UPDATE person SET fname=$1 , lname=$2 ,sex=$3, dateofbirth=$4,address=$5, city=$6,country=$7 WHERE person.fname=$8;
execute query(fname,lname,sex,dateofbirth,address,city,country,fname);

【讨论】:

  • 如果你使用quote_literal(),就不能再有sql注入了。 prepare query as UPDATE person SET fname=$1 , lname=$2 ,sex=$3, dateofbirth=$4,address=$5, city=$6,country=$7 WHERE person.fname=$8;execute query(quote_literal(fname), quote_literal(lname), sex,dateofbirth,address,city,country,fname);
猜你喜欢
  • 2014-10-10
  • 2020-08-10
  • 2015-07-23
  • 1970-01-01
  • 1970-01-01
  • 2011-12-13
  • 1970-01-01
  • 2021-08-08
相关资源
最近更新 更多