我是 PostgreSQL 数据库的新手。最近我们的开发人员需要对我们的系统进行一些升级。
因此,我们计划实施一些方法来实现数据库故障转移。
根据我在此处阅读 postgresql wiki ,我们正在尝试实现热备用或热备用。所以我的问题是:
我有一个 Postgres 8.4 表,其中包含类型为“字符变化”的列,但我想将它们转换为枚举类型。
尝试更改表格时
ALTER TABLE logs ALTER COLUMN interface_type TYPE interface_types
USING interface_type::text::interface_types;
Run Code Online (Sandbox Code Playgroud)
我收到一个错误
default for column "interface_type" cannot be cast to type interface_types
Run Code Online (Sandbox Code Playgroud)
该列的默认值是枚举类型中值的文本版本。所以这应该是可能的,尽管我没有运气谷歌搜索解决方案。
我假设我需要为它定义一个演员表。如何?
我正在尝试将我的单元测试从 H2 迁移到 Postgresql。
目前,H2 为我提供了一个内存模式,这样每个连接都映射到一个唯一的模式、创建表、运行测试并删除模式。模式创建和销毁由 H2 自动处理。
单元测试同时运行。
在 Postgresql 中执行此操作的最佳方法是什么?具体来说,
我有关于在不同国家旅行的人的数据,如下所示:
country | begintimestamp | distance
Germany | 2015-01-01 00:00:00 | 100
Germany | 2015-01-01 01:12:13 | 30
France | 2015-01-01 02:13:14 | 40
France | 2015-01-01 03:14:15 | 20
Spain | 2015-01-01 04:15:16 | 10
France | 2015-01-01 05:16:17 | 30
France | 2015-01-01 05:17:18 | 5
Germany | 2015-01-01 06:18:19 | 3
Run Code Online (Sandbox Code Playgroud)
我需要的是能够收到这样的结果 -distance与最早的连续行相加begintimestamp:
country | begintimestamp | distance
Germany | 2015-01-01 00:00:00 | 130 // 100+30, the distance of two first rows summed. …Run Code Online (Sandbox Code Playgroud) 假设我有一个名为 的表people,其中id是主键:
+-----------+---------+---------+
| id | fname | lname |
| (integer) | (text) | (text) |
+===========+=========+=========+
| 1 | Daniel | Edwards |
| 2 | Fred | Holt |
| 3 | Henry | Smith |
+-----------+---------+---------+
Run Code Online (Sandbox Code Playgroud)
我正在尝试编写一个行重复查询,该查询足够健壮,可以解释表的架构更改。每当我向表中添加一列时,我都不想回去修改重复查询。
我知道我可以做到这一点,这将复制记录 ID 2 并为复制的记录提供一个新 ID:
INSERT INTO people (fname, lname) SELECT fname, lname FROM people WHERE id = 2;
Run Code Online (Sandbox Code Playgroud)
但是,如果我添加一age列,则需要修改查询以同时考虑年龄列。
显然我不能执行以下操作,因为它还会复制主键,从而导致duplicate key value violates unique constraint-- 而且,无论如何我都不希望它们共享相同的 ID:
INSERT INTO people …Run Code Online (Sandbox Code Playgroud) 我知道 PostgreSQL 为并发控制提供了多种锁定模式。当我通读他们的文件时,我不明白为什么ACCESS EXCLUSIVE在任何情况下都需要锁。EXCLUSIVE锁和ACCESS EXCLUSIVE锁之间的唯一区别似乎是ACCESS EXCLUSIVE锁不允许从表中读取。
但是,人们能够阅读不是一件好事吗?在什么情况下应该阻止用户阅读?在文档中,我看到通常DROP TABLE等会使用ACCESS EXCLUSIVE锁,但为什么呢?我在想,也许当您删除表时,当您尝试读取时,数据已经部分消失,因此结果将被破坏。但是后来我意识到由于 Postgres 中的所有内容都是事务性的,DROP TABLE因此在提交之前不应该生效。所以我的猜测应该是错误的。
我还是很困惑。ACCESS EXCLUSIVE当您将它与EXCLUSIVE锁定进行比较时,为什么又需要锁定?我最好的猜测是用ACCESS EXCLUSIVE锁替换锁EXCLUSIVE不会破坏 PostgreSQL。只是有时人们不希望别人阅读。我错过了什么?
我在 Ubuntu Linux 14.04 上使用 Postgres 9.3。如何安装/启用 uuid-ossp 扩展?我首先验证了 contrib 包是否已安装……
root@prodbox:/home/rails/myproject# apt-get install postgresql-contrib
Reading package lists... Done
Building dependency tree
Reading state information... Done
postgresql-contrib is already the newest version.
Run Code Online (Sandbox Code Playgroud)
然后我登录并尝试创建扩展...
root@prodbox:/home/rails/myproject# su - postgres
postgres@prodbox:~$ psql
psql (9.6.0, server 9.3.11)
Type "help" for help.
postgres=# CREATE EXTENSION "uuid-ossp";
ERROR: could not open extension control file "/usr/share/postgresql/9.3/extension/uuid-ossp.control": No such file or directory
Run Code Online (Sandbox Code Playgroud)
我都没有想法了。我错过了什么?
以前,我会将多个表合并为一个并返回结果,但在许多表中我有相同的列名。这就是为什么我决定用表名作为列名的前缀。但这打破了我必须自动更新我的updated_at专栏的触发器。
这是我的功能:
CREATE OR REPLACE FUNCTION update_updated_at()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at = now();
RETURN NEW;
END;
$$ language 'plpgsql';
Run Code Online (Sandbox Code Playgroud)
我会添加一个触发器,如:
CREATE TRIGGER update_users_updated_at
BEFORE UPDATE ON users
FOR EACH ROW EXECUTE PROCEDURE update_updated_at();
Run Code Online (Sandbox Code Playgroud)
但是现在我的专栏被命名了users_updated_at,这不起作用。我的问题是有什么方法可以将列名传递给触发器并更新传递的列,还是有其他我不知道的方法?
我有一个 PostgreSQL 数据库,我运行了大量的负载。我希望这个负载尽可能快。我已经在使用复制命令等。
我一直在阅读关于timescaledb以及它如何提供改进的插入性能。但是,如果我只关心插入性能,我想知道使用 hypertables 而不是常规表是否有任何缺点?
我一直在学习SIMPLE和FULL匹配 PostgreSQL 中的外键,我想知道以下思考过程是否正确:
一旦外键的至少一个引用列包含一个NULL值,就没有指向被引用表的链接。这是因为根据 3VL,aNULL无法与另一个NULL值进行比较。这也意味着在相关列中至少包含一个值的引用行被更新或删除时,定义的级联操作(例如... DO DELETE, ... DO SET NULL, ..)NULL永远不会发生,因为没有指向引用行的链接。更具体地说,假设有一个从表A(x, y)到的外键B(x, y)。如果同时A和B包含的行(5, NULL)为x及y,有没有联系,因为NULL该行A是不是等于NULL在列B。
这样对吗?我对 SQL 很陌生,所以我想知道我是否正确理解了这一点。
postgresql ×10
cast ×1
dynamic-sql ×1
foreign-key ×1
functions ×1
linux ×1
mvcc ×1
performance ×1
plpgsql ×1
timescaledb ×1
trigger ×1
unit-test ×1
uuid ×1