我使用MySQL已经有一段时间了,我决定学习Postgres。转变并不可怕,但我今天遇到了一个障碍:
我有管理员帐户postgres和专门用于此应用程序的用户tv。为了方便起见,我正在修改管理员帐户下的表中的一些行。该网站不会反映我对数据库所做的任何更改。
在指责我的各种缓存策略大约一个小时后,我终于psql以tv用户身份运行,并注意到其中没有任何行反映以 登录时所做的更改postgres。对于具有 MySQL 背景的我来说,这种行为完全令人困惑。
长话短说:这是一个功能,还是我在某个地方配置错误了?有什么办法可以让数据库不出现这样的情况吗?
谢谢你的帮助。
[12:23:04] 布莱克$ sudo -u postgres psql -d teevee
psql (9.1.3)
输入“帮助”以获得帮助。
teevee=# 从剧集中选择 COUNT(*) 个;
数数
--------
1
(1 行)
[12:23:25] 布莱克$ psql -U 电视 -d teevee -h localhost -W 用户 tv 的密码: psql (9.1.3) SSL 连接(密码:DHE-RSA-AES256-SHA,位:256) 输入“帮助”以获得帮助。 teevee=> 从剧集中选择 COUNT(*) 个; 数数 -------- 176 (1 行)
您可以使用\dn或\dn+under列出模式psql,但我建议使用 pgAdmin 这样的工具来获得更好的视觉表示。您可以使用和 来查找这些潜在的表tv和public架构中是否存在冲突的表。\dt public.*\dt tv.*
使用多个模式可能很有用,但通常不是必需的。
默认搜索路径往往是"$user",public,这意味着它将首先尝试使用以用户命名的模式中的表,然后回退到该public模式(最常见)。
我建议public一般使用该模式,除非您有充分的理由不这样做。这通常应该是默认值。(我不确定你为什么有另一个模式。)
您可以使用ALTER TABLE xxxxxx SET SCHEMA yyyyyyy更改表架构,但您可能需要事先删除名称冲突的另一个表架构。您肯定想先将数据复制出来。
类似的东西INSERT INTO public.episode SELECT * FROM tv.episode应该适合你的情况,如果指定了列名就更好了。这是否有效可能取决于其他限制。
public如果目前您的架构中没有任何有用的内容,您不妨完全删除该架构 ( DROP SCHEMA public) 并重命名另一个架构 ( ALTER SCHEMA tv RENAME to public)。根据已经授予的内容,您可能还需要这样的东西:
GRANT ALL ON SCHEMA public TO postgres;
GRANT ALL ON SCHEMA public TO public;
Run Code Online (Sandbox Code Playgroud)