Ray*_*Ray 9 postgresql foreign-key insert update
我目前有一个看起来像这样的表:
CREATE TABLE "PDPC".collection
(
col_no bigint NOT NULL DEFAULT nextval('"PDPC".collection_col_no_seq'::regclass),
q1 character varying(10000) COLLATE pg_catalog."default",
q2 character varying(10000) COLLATE pg_catalog."default",
q3 character varying(10000) COLLATE pg_catalog."default",
q4 character varying(10000) COLLATE pg_catalog."default",
dg_fkey bigint,
CONSTRAINT collection_pkey PRIMARY KEY (col_no),
CONSTRAINT collection_dg_fkey_fkey FOREIGN KEY (dg_fkey)
REFERENCES "PDPC".datagroup (dg_no) MATCH SIMPLE
ON UPDATE NO ACTION
ON DELETE NO ACTION
)
WITH (
OIDS = FALSE
)
TABLESPACE pg_default;
ALTER TABLE "PDPC".collection
OWNER to postgres;
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用 postgresql 在 PHP 中执行 UPSERT 语句,但我收到了
致命错误:未捕获的 PDOException:SQLSTATE[42P10]:无效的列引用:7 错误:在 C:\Apache24\htdocs\thinking.php:77 中没有与 ON CONFLICT 规范匹配的唯一或排除约束:堆栈跟踪:#0 C: \Apache24\htdocs\conceptation.php(77): PDOStatement->execute() #1 {main} 被抛出到 C:\Apache24\htdocs\conceptation.php 第 77 行
我的网页目前有一个表单,可以让用户输入四个问题的答案,这些问题将进入"PDPC".collection表格。我想根据 运行 INSERT 或 UPDATE dm_fkey,这是我为此表设置的外键。
这是我使用的 UPSERT 语句。
INSERT INTO "PDPC".collection (q1, q2, q3, q4, dg_fkey)
VALUES (:q1, :q2, :q3, :q4, :dg_no)
ON CONFLICT(dg_fkey) DO UPDATE
SET q1=:q1, q2=:q2, q3=:q3, q4=:q4
Run Code Online (Sandbox Code Playgroud)
错误:没有与 ON CONFLICT 规范匹配的唯一或排除约束
这是因为dg_fkey是 a 中引用的列FOREIGN KEY CONSTRAINT而不是索引。事实上,如果你希望它更快,你可以考虑额外添加一个索引。从文档开始ON CONFLICT
你可能想要这样的东西,
CREATE UNIQUE INDEX asdf ON pdpc.collection(dg_fkey);
Run Code Online (Sandbox Code Playgroud)
或将其添加到 ddl,
CREATE TABLE pdpc.collection
(
dg_fkey bigint UNIQUE
Run Code Online (Sandbox Code Playgroud)
然后你的 upsert 将起作用。
也永远不要在标识符上使用双引号,这在 Pg 中是一种可怕的做法
| 归档时间: |
|
| 查看次数: |
24963 次 |
| 最近记录: |