Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 更新作为主键的列值_Postgresql - Fatal编程技术网

Postgresql 更新作为主键的列值

Postgresql 更新作为主键的列值,postgresql,Postgresql,我想在这里更新分类表。在jsp中 代码如下所示: pstmt = conn.prepareStatement("UPDATE category SET description = ? where categoryname = ?"); pstmt.setString(1, request.getParameter("description")); pstmt.setString(2, request.getParameter("categoryname")); 而如果使用这种方式,我只能更

我想在这里更新分类表。在jsp中 代码如下所示:

pstmt = conn.prepareStatement("UPDATE category SET description = ? where  categoryname = ?");
pstmt.setString(1, request.getParameter("description"));
pstmt.setString(2, request.getParameter("categoryname")); 
而如果使用这种方式,我只能更改描述值,而不能更改categoryname值。 表格如下:

CREATE TABLE category
(
  categoryname character varying NOT NULL,
  description character varying,
  CONSTRAINT category_pkey PRIMARY KEY (categoryname)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE category
  OWNER TO postgres;
我想知道是否可以更改categoryname列的值。如何更改jsp代码? categoryname是主键,因为product表在这里有外键引用。
谢谢。

是的,您可以更改categoryname列的值,但要小心。如果使用已存在的值更新此字段,则查询可能会失败

正如Joop所说,最佳做法是添加一个附加字段作为主键,该字段与业务数据没有任何关系

您的新数据库结构可能如下所示:

CREATE TABLE category
(
  id serial not null,
  categoryname character varying NOT NULL,
  description character varying,
  CONSTRAINT category_pkey PRIMARY KEY (id)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE category
  OWNER TO postgres;

当然,外键必须引用“id”而不是“categoryname”

一般来说,使用varchar列作为主键是个坏主意。在大多数情况下,会添加代理整数PK或SERIAL,并对varchar categoryname列应用唯一约束。这还将在引用类别表时,将具有FKs的其他表减少到此表,以仅使用整数字段。