我正在尝试学习 PostgreSQL 管理并开始学习如何使用psql命令行工具。
当我使用 登录时psql --username=postgres,如何列出所有数据库和表?
我曾尝试\d,d并dS+但没有列出。我已经用 pgAdmin III 创建了两个数据库和几个表,所以我知道它们应该被列出。
我想针对我的 PostgreSQL 数据库对一些 SQL 查询进行基准测试。有什么方法可以使用 SQL 查询时间psql吗?
我有一张桌子items (item_id serial, name varchar(10), item_group int)和一张桌子items_ver (id serial, item_id int, name varchar(10), item_group int)。
现在我想在items_verfrom 中插入一行items。是否有任何简短的 SQL 语法来执行此操作?
我试过:
INSERT INTO items_ver VALUES (SELECT * FROM items WHERE item_id = 2);
Run Code Online (Sandbox Code Playgroud)
但我收到一个语法错误:
ERROR: syntax error at or near "select"
LINE 1: INSERT INTO items_ver VALUES (SELECT * FROM items WHERE item...
Run Code Online (Sandbox Code Playgroud)
我现在尝试:
INSERT INTO items_ver SELECT * FROM items WHERE item_id = 2;
Run Code Online (Sandbox Code Playgroud)
它工作得更好,但我遇到了一个错误:
ERROR: column "item_group" is of type integer …Run Code Online (Sandbox Code Playgroud) Unix 时间戳是自 UTC 时间 1970 年 1 月 1 日午夜以来的秒数。
如何从 PostgreSQL 获取正确的 unix 时间戳?
与currenttimestamp.com和timestamp.1e5b.de相比时,我没有从 PostgreSQL 得到预期的时间:
这将返回正确的时间戳:
SELECT extract(epoch from now());
Run Code Online (Sandbox Code Playgroud)
虽然这不会:
SELECT extract(epoch from now() at time zone 'utc');
Run Code Online (Sandbox Code Playgroud)
我住在 UTC +02 时区。从 PostgreSQL 获取当前 unix 时间戳的正确方法是什么?
这将返回正确的时间和时区:
SELECT now();
now
-------------------------------
2011-05-18 10:34:10.820464+02
Run Code Online (Sandbox Code Playgroud)
另一个对比:
select now(),
extract(epoch from now()),
extract(epoch from now() at time zone 'utc');
now | date_part | date_part
-------------------------------+------------------+------------------
2011-05-18 10:38:16.439332+02 | 1305707896.43933 | 1305700696.43933
(1 …Run Code Online (Sandbox Code Playgroud) 如果我有一个包含列的表:
id | name | created_date
Run Code Online (Sandbox Code Playgroud)
并想添加一列,我使用:
alter table my_table add column email varchar(255)
Run Code Online (Sandbox Code Playgroud)
然后在列之后添加created_date列。
有什么办法可以指定新列的位置吗?例如,我可以在之后添加它name并得到一个表格,如:
id | name | email | created_date
Run Code Online (Sandbox Code Playgroud) 我有一张桌子:
CREATE TABLE names (id serial, name varchar(20))
Run Code Online (Sandbox Code Playgroud)
我想要那个表中的“最后插入的 id”,而不是RETURNING id在插入时使用。好像有一个函数CURRVAL(),但我不明白如何使用它。
我试过:
SELECT CURRVAL() AS id FROM names_id_seq
SELECT CURRVAL('names_id_seq')
SELECT CURRVAL('names_id_seq'::regclass)
Run Code Online (Sandbox Code Playgroud)
但它们都不起作用。如何使用currval()获取最后插入的 ID?
我使用One click installer在装有 Mac OS X 的计算机上安装了 PostgreSQL 。然后我尝试使用该psql命令访问 PostgreSQL ,但它似乎不可用。
我收到这条消息:
psql
-bash: psql: command not found
Run Code Online (Sandbox Code Playgroud)
我需要安装更多东西吗?或者我如何配置 PostgreSQL 以便我可以在我的计算机上使用它?
如果没有返回行,我想为应该使用的列使用默认值。这在 PostgreSQL 中可能吗?我该怎么做?或者我还有其他方法可以解决这个问题吗?
例如这样的事情:
SELECT MAX(post_id) AS max_id DEFAULT 0 FROM my_table WHERE org_id = 3
Run Code Online (Sandbox Code Playgroud)
如果org_id = 3表中没有行,我想返回0。
我timestamp without time zone default now()在 PostgreSQL 数据库中有一个类型为“创建”的列。
如果我选择 colums,默认情况下它有一个漂亮且可读的格式:
SELECT created FROM mytable;
created
---------------------------
2011-05-17 10:40:28.876944
Run Code Online (Sandbox Code Playgroud)
但我想在几毫秒内获得时间戳(作为一个 Long)。像这样的东西:
SELECT myformat(created) FROM mytable;
created
-----------------
2432432343876944
Run Code Online (Sandbox Code Playgroud)
如何仅在几毫秒内从 PostgreSQL 获取时间戳列?
回复杰克:
我确实得到与您相同的差异(-3600),但是如果我使用timestamp with time zone我可以看到“错误”或差异是因为 '1970-01-01' 获得 time zone +01。
create table my_table_2(created timestamp with time zone);
CREATE TABLE
insert into my_table_2 (created) values (now()), ('1970-01-01');
INSERT 0 2
select created, extract(epoch from created) from my_table_2;
created | date_part
-------------------------------+------------------
2011-05-18 11:03:16.909338+02 | 1305709396.90934
1970-01-01 …Run Code Online (Sandbox Code Playgroud) postgresql ×10
psql ×3
timestamp ×2
aggregate ×1
benchmark ×1
command-line ×1
datatypes ×1
date-format ×1
derby ×1
insert ×1
installation ×1
mac-os-x ×1
primary-key ×1
select ×1
sequence ×1
tools ×1