PostgreSQL是否支持计算/计算列,如MS SQL Server?我在文档中找不到任何内容,但由于此功能包含在许多其他DBMS中,我认为我可能会遗漏某些内容.
postgresql materialized-views calculated-columns sql-view generated-columns
我有以下架构:
\nCREATE TABLE books (\n title VARCHAR(255),\n subtitle TEXT\n);\nRun Code Online (Sandbox Code Playgroud)\n添加没有权重的生成列工作正常:
\nALTER TABLE books ADD COLUMN full_text_search TSVECTOR\n GENERATED ALWAYS AS (to_tsvector(\'english\',\n coalesce(title, \'\') ||\' \'||\n coalesce(subtitle, \'\')\n )) STORED; -- \xe2\x9c\x85 Working\nRun Code Online (Sandbox Code Playgroud)\n现在我想添加权重但不起作用:
\nALTER TABLE books ADD COLUMN full_text_search_weighted TSVECTOR\n GENERATED ALWAYS AS (to_tsvector(\'english\',\n setweight(coalesce(title, \'\'), \'A\') ||\' \'||\n setweight(coalesce(subtitle, \'\'), \'B\')\n )) STORED; -- \xe2\x9d\x8c Not working\nRun Code Online (Sandbox Code Playgroud)\n有没有办法在 postgres 中生成的列中包含权重?
\n复制链接:https://www.db-fiddle.com/f/4jyoMCicNSZpjMt4jFYoz5/1385
\n我正在向表中添加一些列,并且想要一个将它们组合在一起的生成列,我将使用它作为唯一索引。当我尝试添加列时,出现错误ERROR: generation expression is not immutable。
我遵循了这个问题的解决方案,并且专门使用CASE和||进行字符串连接,这应该是immutable.
ALTER TABLE tag
ADD COLUMN prefix VARCHAR(4) NOT NULL,
ADD COLUMN middle BIGINT NOT NULL,
ADD COLUMN postfix VARCHAR(4), -- nullable
-- VARCHAR size is 4 prefix + 19 middle + 4 postfix + 2 delimiter
ADD COLUMN tag_id VARCHAR(29) NOT NULL GENERATED ALWAYS AS
(CASE WHEN postfix IS NULL THEN prefix || '-' || middle
ELSE prefix || '-' || middle || '-' …Run Code Online (Sandbox Code Playgroud) 我需要生成一个 SQL 查询,它可以生成遵循某种模式的列
模式是这样存储的Hello [Name] [lastname]
其中name和lastname都是表中的列。
如何在 end、start 和 ind Between 属性处添加常量字符串?
以及如何区分表列和我添加的列应包含的字符串?
我的查询目前看起来像这样 - 然后模式
ALTER TABLE IF public.nameRegistration
DROP COLUMN IF EXISTS generated_colum
ADD COLUMN generated_colum TEXT generated ALWAYS as (|Pattern|) stored;
Run Code Online (Sandbox Code Playgroud)
模式只是Hello Name lastname
我已经给出了一些来自 PHP 的例子,只是为了指出我的开发环境。问题不是关于 PHP,而是纯粹关于 PostgreSQL。
生成的列有两种:存储的和虚拟的。存储的生成列在写入(插入或更新)时进行计算,并像普通列一样占用存储空间。虚拟生成列不占用存储空间,读取时进行计算。
但是,它只显示了该页面示例中存储列的示例,而不是虚拟列。它还说:
必须指定关键字 STORED 来选择生成列的存储类型。有关更多详细信息,请参阅创建表。
...链接到CREATE TABLE 页面的地方。在该页面中,文档明确指出模式是GENERATED ALWAYS AS (expression) STORED.
GENERATED ALWAYS AS ( generation_expr ) 存储
此子句将列创建为生成的列。该列无法写入,读取时将返回指定表达式的结果。
需要关键字 STORED 来表示该列将在写入时计算并将存储在磁盘上。
生成表达式可以引用表中的其他列,但不能引用其他生成的列。使用的任何函数和运算符都必须是不可变的。不允许引用其他表。
我实际上尝试在 Laravel (PHP) 中实现一个虚拟字段,这是我迄今为止在迁移中想到的:
DB::statement('ALTER TABLE entries ADD COLUMN do_hint BOOLEAN GENERATED ALWAYS AS (hint_hash OR hint_tags OR hint_due_date OR hint_created_at OR hint_updated_at) VIRTUAL');
Run Code Online (Sandbox Code Playgroud)
正如您在此语句中所见,表中有hint_hash,hint_tags和其他几个布尔列(以hint_*glob 模式命名)entries。我想计算do_hint即时,以便:
我已经阅读了有关它们的 MySQL 文档,但仍然不清楚存储/虚拟生成列的好处?将相同的数据存储在实际列中并将其索引到内存中有何优点/缺点?有哪些优点/缺点,以及使用它们更有效或更好的最佳时间/示例?谢谢你!
postgresql ×5
sql ×2
alter-table ×1
create-table ×1
mysql ×1
sql-view ×1
string ×1
tsvector ×1
weighted ×1