我正在数据库中寻找一条我不了解的精确信息。数据库在一台单独的机器上,但我可以登录它,并psql
以管理员权限启动命令行。
这是第三方产品,他们回答问题的速度很慢。我知道数据在那个数据库里面,所以我想做一点逆向工程。
给定一个表名,是否可以获得该表中列名的列表?
例如,在 SQL Server 中,可以将表转储到可重用CREATE
语句中,该语句以文本方式列出了该表所包含的所有列。
假设我们有用户,每个用户可以有多个电子邮件地址
CREATE TABLE emails (
user_id integer,
email_address text,
is_active boolean
)
Run Code Online (Sandbox Code Playgroud)
一些示例行
user_id | email_address | is_active
1 | foo@bar.com | t
1 | baz@bar.com | f
1 | bar@foo.com | f
2 | ccc@ddd.com | t
Run Code Online (Sandbox Code Playgroud)
我想强制执行一个约束,即每个用户都只有一个活动地址。我怎样才能在 Postgres 中做到这一点?我可以这样做:
CREATE UNIQUE INDEX "user_email" ON emails(user_id) WHERE is_active=true;
Run Code Online (Sandbox Code Playgroud)
这可以防止用户拥有多个活动地址,但我相信不会防止他们的所有地址都设置为 false。
如果可能的话,我更愿意避免使用触发器或 pl/pgsql 脚本,因为我们目前没有这些脚本,而且设置起来会很困难。但我很感激知道“唯一的方法是使用触发器或 pl/pgsql”,如果是这样的话。
postgresql database-design constraint referential-integrity ddl
我寻找一种简单的方法来选择除 psql 中的一列之外的所有列。
随着psql
我的意思是交互式命令行。
我会很高兴有一个工具可以扩展到*
引用的列名列表。然后我可以移除列以手动移除。
我的问题只是关于 psql 的交互使用。它不是那些对 sql 标准不满意并且想要执行诸如“select *-foo”之类的问题的人的问题的重复。
我经常需要在应用程序中克隆行,所以我会花很长的时间来完成它:
INSERT INTO mytable (a, b, c)
SELECT a,b,c FROM mytable WHERE id=12;
Run Code Online (Sandbox Code Playgroud)
(id 被声明为 a SERIAL PRIMARY KEY
, 12 是要克隆的行)。
问题是,当我添加新字段时,mytable
我必须记住更新克隆函数以也克隆这些新字段。
我想以更易于维护的方式克隆行。就像是 :
INSERT INTO mytable
SELECT *, id:DEFAULT FROM mytable WHERE id=12;
Run Code Online (Sandbox Code Playgroud)
在我编写本文时,我还认为克隆详细信息行会很好:如果我有一个使用引用完整性声明的详细信息/子表,如下所示:
CREATE TABLE mychild (
id serial PRIMARY KEY,
parentid int REFERENCES mytable(id),
a text
);
Run Code Online (Sandbox Code Playgroud)
我可以用一个命令克隆 mytable 和所有子表,而不是:
id
mychild
,设置parentid
为新的id
PostgreSQL(或扩展)中是否有任何内容可以帮助处理这些情况?
在触发器主体中,如何NEW
通过其字段名称为其分配值?
这就是我想要做的:
some_key = "some_column";
NEW[some_key] = 5;
Run Code Online (Sandbox Code Playgroud) 我已经啮合在一起的方式来确定什么data_type
是在data_type
创建基于掀起了新表时,你的语法使用PostgreSQL的维基页面。
如果我的查询有问题,我需要真正知道在给定场景中什么会在显式上下文中抛出它在纯粹的测试数据库/表上运行一个或多个查询以修改该数据库/表,所以运行这个查询以测试任何误报。
SELECT pg_attribute.attname,
format_type(pg_attribute.atttypid, pg_attribute.atttypmod),
CASE
WHEN format_type(pg_attribute.atttypid, pg_attribute.atttypmod)='bigint' THEN 'bigserial'
WHEN format_type(pg_attribute.atttypid, pg_attribute.atttypmod)='integer' THEN 'serial'
END AS type
FROM pg_index, pg_class, pg_attribute
WHERE pg_class.oid = 'delete2'::regclass
AND indrelid = pg_class.oid
AND pg_attribute.attrelid = pg_class.oid
AND pg_attribute.attnum = any(pg_index.indkey)
AND indisprimary;
Run Code Online (Sandbox Code Playgroud)
这是一个带有主键的表,该表不使用此查询返回主键:
CREATE TABLE delete_key_bigserial (
test1 integer,
id bigserial NOT NULL,
col1 text,
col2 text,
test2 integer
);
Run Code Online (Sandbox Code Playgroud) postgresql ×6
catalogs ×2
constraint ×1
datatypes ×1
ddl ×1
functions ×1
insert ×1
metadata ×1
plpgsql ×1
primary-key ×1
psql ×1
sequence ×1
trigger ×1