我正在尝试修改表中键的值。
我有一个数据库(如果相关的话,这是给Immich的)。请参阅下表的详细信息。我正在尝试将“library.watch.usePolling”从“true”修改为“false”。我正在使用这个命令并收到错误。我不确定这个错误意味着什么,也不知道我是否使用了正确的命令。我知道这肯定是一个简单的问题,但我是 PostgreSQL 的初学者。
UPDATE system_config
SET value = false
WHERE key = library.watch.usePolling
;
ERROR: missing FROM-clause entry for table "watch"
LINE 3: WHERE key = library.watch.usePolling
这些是数据库中当前存在的表的详细信息。
\d+ system_config
Table "public.system_config"
Column | Type | Collation | Nullable | Default | Storage | Compression | Stats target | Description
--------+-------------------+-----------+----------+---------+----------+-------------+--------------+-------------
key | character varying | | not null | | extended | | |
value | character varying | | | | extended | | |
Indexes:
"PK_aab69295b445016f56731f4d535" PRIMARY KEY, btree (key)
Access method: heap
SELECT * from "system_config";
key | value
-------------------------------------+---------------
ffmpeg.transcode | "disabled"
job.objectTagging.concurrency | 4
job.clipEncoding.concurrency | 4
job.sidecar.concurrency | 4
job.migration.concurrency | 4
job.library.concurrency | 80
job.thumbnailGeneration.concurrency | 20
job.metadataExtraction.concurrency | 50
job.recognizeFaces.concurrency | 6
storageTemplate.enabled | true
ffmpeg.accel | "qsv"
library.scan.cronExpression | "0 */6 * * *"
job.smartSearch.concurrency | 60
job.faceDetection.concurrency | 60
library.watch.enabled | true
library.watch.usePolling | true
(16 rows)
注意:我也尝试过这个命令:
SET "system_config.value" = "false" WHERE "system_config.key" = "library.watch.usePolling";
我尝试了几种选择。主要在这里:
UPDATE system_config
SET value = false
WHERE key = library.watch.usePolling
;
ERROR: missing FROM-clause entry for table "watch"
LINE 3: WHERE key = library.watch.usePolling
和
SET "system_config.value" = "false" WHERE "system_config.key" = "library.watch.usePolling";
ERROR: syntax error at or near "WHERE"
LINE 1: SET "system_config.value" = "false" WHERE "system_config.key...
对于初学者来说,我不会使用
key
或 value
作为字段名称 - 如果您查看 here,您会看到这两个单词都出现在该列表中。它们也出现在 PostgreSQL list 中(但作为非保留) - 再次,避免此列表中的任何单词 - 腰带和大括号!我建议您将字段名称更改为(类似)sc_key
和 sc_value
- 这些也更有意义。
ALTER TABLE table_name
RENAME COLUMN column_name TO new_column_name;
所以,
ALTER TABLE system_config
RENAME COLUMN key TO sc_key;
value
也一样。
RENAME CONSTRAINT
)PRIMARY KEY
- 告诉用户存在违反 PK_aab69295b445016f56731f4d535
的错误消息绝对没有意义 - 将其更改为类似 sc_pk
的内容
(或system_config_pk
)。
顺便说一句,永远不需要(双倍)引用您的标识符(例如表、列或约束)名称除非出于某种原因,您希望(和/或)有义务尊重大小写。
如果没有,我的建议是对所有内容都使用snake_case(小写并用下划线分隔单词以使其可读)。互联网上有各种 SQL 风格指南(这个很好) - 但选择一种风格并坚持下去 - 这方面的一致性有助于易读性并使调试更容易。
运行几个查询来仔细检查我们的更改(找到代码here&L):
现在,回答你的问题。
双引号用于标识符(表名和列名) - 要指定字符串(在本例中为
CHARACTER VARYING
),您可以使用 单引号!
为了解决您的问题,我执行了以下操作: