问题描述
在PostgreSQL中,我有两列,我希望第二列始终具有与第一列相同的值。
这些列是landmark_id
(整数)和name
(varchar),我希望name
列始终具有与landmark_id
相同的值(id)。 / p>
landmark_id (integer) | name (varchar)
1 1
2 2
3 3
解决方法
我不明白您为什么要这样做,但是我可以想到两种方法来完成您的请求。一种是通过使用生成的列
private void yesAction() {
try {
String text = Files.readString(Paths.get("src\\main\\database\\default.db"));
System.out.println(text);
Files.writeString(Paths.get("src\\main\\database\\main.db"),text,Charset.defaultCharset());
} catch (IOException e) {
e.printStackTrace();
}
}
另一个是通过实施约束
CREATE TABLE g (
landmark_id int,name varchar(100) GENERATED ALWAYS AS (landmark_id::varchar) STORED
)
这两种方法都会导致CREATE TABLE c (
landmark_id int,name varchar(100),CONSTRAINT equality_cc CHECK (landmark_id = name::varchar)
)
列占用磁盘空间。第一种方法不允许您在name
或name
语句中指定INSERT
列。在后一种情况下,插入时将被迫同时指定两列。
您还可以使用触发器来更新第二列。
最新编辑:建议使用其他视图。我同意这是一个比我写的更好的主意。
,按照@jarlh在评论中的建议创建一个view
。系统会自动为您自动生成name
列。通常,与在实际表中多次存储基本上相同的数据相比,这通常是更可取的,在实际表中,数据占用更多的磁盘空间,并且也可能不同步。例如:
CREATE VIEW landmarks_names AS
SELECT landmark_id,landmark_id::text AS name
FROM landmarks;