是否有某种方法可以通过 SQL 在 PostgreSQL 中创建用户/角色/组,但前提是它尚不存在?到目前为止,我发现的唯一解决方案是创建自定义存储过程,因为它支持条件。有没有我忽略的更简单的解决方案?谢谢!
如果我使用 pg_dump 从我的数据库中获取模式,我会得到单独的部分,例如键、约束等,如下所示:
CREATE TABLE public.account (
id uuid NOT NULL,
db_version bigint,
email_address character varying(255) NOT NULL,
full_name character varying(255) NOT NULL
);
....and then later....
ALTER TABLE ONLY public.account
ADD CONSTRAINT account_pkey PRIMARY KEY (id);
这使得整个转储变得非常冗长。如何压缩转储以便将所有内容都放在创建表部分?
PostgreSQL 12
当我重命名表中的列时,我也想动态重命名匹配的检查约束。
我有一个假设的表格:
CREATE TABLE hypothetical_table (
id SERIAL PRIMARY KEY,
some_col text,
some_col_also text
);
有以下限制:
ALTER TABLE hypothetical_table ADD CONSTRAINT some_col_length_>_5 CHECK(char_length(some_col) > 5);
ALTER TABLE hypothetical_table ADD CONSTRAINT some_col_also_length_>_5 CHECK(char_length(some_col_also) > 5);
我不知道列可能有什么限制。我知道它们以列名为前缀。但是,就像some_col
上面的约束一样,该前缀可能与另一列的 ( some_col_also
) 匹配。
当我重命名此表中的列时,我也想重命名约束,以匹配新的列名。
那么,如果我要重命名some_col
,如何选择与该列关联的所有检查约束?
我尝试pg_catalog.pg_constraint
使用pg_catalog.pg_attribute
ON con.conkey = pga.attnum
(conkey
未嵌套)加入,但这会返回许多与该列无关的约束。
我已经构建了比较数据库中的对象并生成脚本以复制不同数据库中的对象的应用程序。当我使用它来检索视图代码时我注意到了什么
select * from INFORMATION_SCHEMA.VIEWS where TABLE_NAME = 'V_SC_ALL_CUSTOMER_DOCUMENTS'
是VIEW_DEFINITION
缩短视图 DDL。然后我学会了使用sys.sql_modules
来获得完整的定义。
我跑了这些
sp_help 'INFORMATION_SCHEMA.VIEWS'
sp_help 'sys.sql_modules'
并发现INFORMATION_SCHEMA.VIEWS.VIEW_DEFINITION nvarchar
size = 8000 和sys.sql_modules.DEFINITION nvarchar
size = -1。我相信nvarchar(max)
。
VIEW_DEFINITION
如果你不能依赖它,那又有什么意义呢?还有其他类型的对象我应该检索sql_modules
而不是从它们相应的表中检索,如过程、触发器等?
您可以使用以下语句重命名列:
ALTER TABLE table_name RENAME COLUMN column_name TO new_column_name;
但是,这会使旧列立即失效。任何使用旧列名的使用站点都会开始出现问题。
有没有办法将表置于临时状态,其中旧名称和新名称都可用于引用列,以便我可以移动我的客户,然后停用旧名称?
Postgresql 缓存准备好的语句及其后续执行的计划。见: https ://www.postgresql.org/docs/current/sql-prepare.html https://stackoverflow.com/questions/7142335/how-does-postgresql-cache-statements-and-data
我的问题是破坏/重写/清除 postgres 缓存的内容是什么?自然,任何 DDL 语句(例如 drop、alter 等)都可以。但是还有其他事情吗?
我有三个表 Faculty {id, name}, Student {id, faculty_id, name}, Course_student {id, student_id, mark}
我会选择每个学院的尖子生
我厌倦了以多种方式执行此操作,但我不能
SELECT Faculty.name, Student.name, MAX(AVG(mark))
FROM (Faculty inner join Student On Faculty.id = Student.faculty_id) inner join Course_student On Student.id = Course_student.student_id
group by Faculty.name
Oracle 10g:假设下表(T_REGISTER):
ID_PROCESS PERIOD CUSTOMER STATUS
===========================================
0001234 201801 12300344 INVALID
0001236 201801 12300344 INVALID
0001246 201801 12300344 UNPAID
0001249 201801 12300344 UNPAID
0001278 201801 12300344 COMPLETED
ID_PROCESS 是 PK。但我还需要 (PERIOD + CUSTOMER + STATUS) 在 STATUS 完成时是唯一的。
换句话说,对于一个 UNIQUE (PERIOD + CUSTOMER),我不在乎有几个 INVALID 或 UNPAID 行,但我只能承认一个唯一的 (PERIOD;CUSTOMER; STATUS="COMPLETED")
在寻求触发解决方案之前使用 CHECK CONSTRAINT 的任何优雅解决方案?提前致谢...
语境
我有 3 个实体(用户、商店和汽车),一辆汽车一次只能有一个regNum
、一个shopId
和一个ownerId
,这就是它们嵌入汽车表的原因。
create table "user"
(
id bigint primary key,
name varchar(40) not null
);
create table "shop"
(
id bigint primary key,
name varchar(40) not null
);
create table "car"
(
id bigint primary key,
ownerId bigint,
regNum varchar(8),
shopId bigint,
price numeric(10,2),
constraint foreign key(ownerId) references "user",
constraint foreign key(shopId) references "shop"
);
问题
我想保留汽车的历史regNum
,ownerId
以及shopId
最终其他未来领域(但不一定是所有领域)。什么是最好的解决方案(可扩展性/性能/易用性)?我找到了下面的那些,也许有人遇到过同样的问题,也许还有另一种解决方案?
解决方案 1
我添加了与要“观看”的字段一样多的历史表。这似乎是一种标准化的工作方式,但它看起来维护起来也很复杂,它也更贪婪,好像我一次修改所有字段(regNum、shopId 和 ownerId),我需要插入 3 条记录(每个记录一个历史等等,如果我稍后看其他领域)。
create table "carOwner"
(
id bigint primary key,
carId bigint not null,
changedAt timestamp not null,
ownerId bigint,
constraint foreign key(carId) references "car",
constraint foreign key(ownerId) references "user"
);
create table "carShop"
(
id bigint primary key,
carId bigint not null,
changedAt timestamp not null,
shopId bigint,
constraint foreign key(carId) references "car",
constraint foreign key(shopId) references "shop"
);
create table "carRegNum"
(
id bigint primary key,
carId bigint not null,
changedAt timestamp not null,
regNum varchar(8),
constraint foreign key(carId) references "car"
);
方案二
我将历史记录保存在一个表中,它是car
表在给定时间的简单快照。它似乎更容易维护,但它并不精确,因为如果我没有以前的记录,我无法直接看到发生了什么变化。
create table "carHistory"
(
id bigint primary key,
carId bigint not null,
changedAt timestamp not null,
ownerId bigint,
regNum varchar(8),
shopId bigint,
constraint foreign key(carId) references "car",
constraint foreign key(shopId) references "shop",
constraint foreign key(ownerId) references "user"
);