重复的 postgresql 模式,包括序列

2023-11-23

我的数据库布局需要为每个新客户创建新架构。目前我使用在网上找到的内部函数并进行了一些修改。

CREATE FUNCTION copy_schema(
    source_schema character varying, 
    target_schema character varying, 
    copy_data boolean)
RETURNS integer AS
$BODY$
DECLARE
    t_ex integer := 0;
    s_ex integer := 0;
    src_table character varying;
    trg_table character varying;
BEGIN
    if (select 1 from pg_namespace where nspname = source_schema) THEN
        -- we have defined target schema
        s_ex := 1;
    END IF;

    IF (s_ex = 0) THEN
        -- no source schema exist
        RETURN 0;
    END IF;

    if (select 1 from pg_namespace where nspname = target_schema) THEN
        -- we have defined target schema need to sync all table layout
        t_ex := 1;
    ELSE
        EXECUTE 'CREATE SCHEMA '||target_schema||' AUTHORIZATION user';
    END IF;

    FOR src_table IN 
       SELECT table_name 
       FROM information_schema.TABLES 
       WHERE table_schema = source_schema
    LOOP
        trg_table := target_schema||'.'||src_table;
        EXECUTE 
            'CREATE TABLE ' || trg_table || ' (LIKE ' || source_schema || '.' || src_table || ' INCLUDING ALL)';
        IF (copy_data = true) THEN
            EXECUTE 'INSERT INTO ' || trg_table || '(SELECT * FROM ' || source_schema || '.' || src_table || ')';
        END IF;
    END LOOP;

    return t_ex;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;

此脚本的问题在于新模式中的表继续使用源模式的序列。有没有办法使用 sql 语句(或其他可靠的方式)为新创建的表获取序列的新副本(或者甚至是复制整个模式的另一种可靠方式)?


问题的根源

与旧序列的连接来自相关列的普通默认值。我引用手册在这里:

复制的列定义的默认表达式将仅是 复制如果INCLUDING DEFAULTS已指定。默认行为是 排除默认表达式,导致复制的列 新表的默认值为空。

由于您使用以下命令创建新表

INCLUDING ALL

And:

INCLUDING ALL是一个缩写形式INCLUDING DEFAULTS INCLUDING CONSTRAINTS INCLUDING INDEXES INCLUDING STORAGE INCLUDING COMMENTS.

..你会得到相同的默认值。您可以排除默认值或显式更改默认值,包括nextval()创建新表后。我不认为有任何中间立场。


使用转储/破解转储/恢复更简单

甚至是另一种复制整个模式的可靠方法

您可以转储模式的模式(相同的单词,不同的含义)pg_dump:

pg_dump $DB -p $PORT -n $SCHEMA -sf /var/lib/postgresql/your_name.pgsql

破解转储(意思是:使用文本编辑器对其进行编辑,或编写脚本):交换转储顶部的模式名称以及所有其他出现的内容SET search_path以及作为序列的模式限定以及可能更多。如果您选择了一个独特的名字对于架构,只需运行一次全局搜索并用您最喜欢的工具替换(sed or vim或...)应该完成这项工作。

然后运行 ​​SQL 脚本psql针对相同或任何其他数据库:

psql $DB -p $PORT -f /var/lib/postgresql/your_name.pgsql > /dev/null

与我第一次发布的相反,串行列在转储中仍然被分割(至少在 PostgreSQL 9.1.5 中)。 SQL 脚本单独创建序列,并将它们附加到序列列:

ALTER SEQUENCE seq OWNED BY tbl.col;

并单独设置默认值。

顺便说一句:当前版本的 pgAdmin 逆向工程serial当满足所有要求时,DDL 脚本中的列。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

重复的 postgresql 模式,包括序列 的相关文章

  • 如何避免应用程序停止后 docker 容器停止

    有一个带有 Postgres 服务器的 docker 容器 postgres 停止或崩溃 无关紧要 我需要检查一些环境变量和一些文件的状态 默认情况下 容器在应用程序完成后停止 我知道有一个选项可以更改 dockerfile 中的默认行为
  • SQL:查找每个跑步者跑步之间的平均天数

    因此 如果我们给出下表 runner ran Carol 2011 02 01 Alice 2011 02 01 Bob 2011 02 01 Carol 2011 02 02 Bob 2011 02 02 Bob 2011 02 03 B
  • 使用包含空值列的 WHERE 子句的更新语句

    我正在使用另一个表中的数据更新一个表上的列 这WHERE子句基于多个列 并且某些列为空 根据我的想法 这个空值是什么throwing off你的标准UPDATE TABLE SET X Y WHERE A B陈述 See 这个 SQL 小提
  • 多租户 Rails 应用:不同技术的优缺点是什么?

    我最初是为一位客户编写 Ruby on Rails 应用程序的 现在 我正在更改它 以便它可以用于不同的客户 我的最终目标是某些用户 不是我 可以单击按钮并创建一个新项目 然后生成所有必要的更改 新架构 新表 代码处理 无需任何人需要我编辑
  • 与 FOREIGN KEY 约束冲突

    我有两张桌子 学术界 CREATE TABLE dbo R ACADEMIE ID ACADEMIE dbo IDENTIFIANT NOT NULL LC ACADEMIE CODE dbo LIBELLE COURT NOT NULL
  • 如何在 SQLite 中获取最后插入的 ID?

    SQLite 中是否有任何内置函数可以获取最后插入的行 ID 例如 在 mysql 中我们有LAST INSERT ID 这种功能 对于 sqlite 任何可用于执行相同过程的函数 请帮我 Thanks SQLite 这可以使用SQLite
  • 将 docker-compose.yml 中的包安装到 docker 容器中

    我是 docker 和 docker compose 的初学者 我需要你的帮助 我正在使用 docker compose 制作 PHP NGINX PostgresQL symfony 开发环境 这里是 web image nginx 1
  • 如何在SqlAlchemy中执行“左外连接”

    我需要执行这个查询 select field11 field12 from Table 1 t1 left outer join Table 2 t2 ON t2 tbl1 id t1 tbl1 id where t2 tbl2 id is
  • 按时间戳聚合

    搜索引擎优化 gt 搜索引擎优化 gt 付费 1 付费 gt 付费 gt 联盟 gt 付费 1 SEO gt 会员 1我有一个查询 结果包含客户 ID 号 营销渠道 时间戳和购买日期的数据 所以 结果可能看起来像这样 id marketin
  • Mysql 在给定日期时间范围内插入随机日期时间

    使用 SQL 我可以在给出范围的列中插入随机日期时间值吗 例如 给定一个范围2010 04 30 14 53 27 to 2012 04 30 14 53 27 我对范围部分感到困惑 因为我刚刚做了这个 INSERT INTO someta
  • 如何在postgres中获取数组大小大于1的数组

    我有一个看起来像这样的表 val fkey num 1 1 1 1 2 1 1 3 1 2 3 1 我想要做的是返回一组行 其中值按 val 分组 并带有一个 fkey 数组 但仅限于 fkey 数组大于 1 的情况 因此 在上面的示例中
  • 仅基于月份和年份的 SQL Server 日期比较

    我无法确定仅根据月份和年份比较 SQL 中的日期的最佳方法 我们根据日期进行计算 由于计费是按月进行的 因此该月的日期会造成更多障碍 例如 DECLARE date1 DATETIME CAST 6 15 2014 AS DATETIME
  • 将一个大的 postgres 表拆分为多个 csv

    我正在使用以下 psql 查询连接到远程主机并将一个大表拆分为多个 csv 文件 psql h xx p xx U xx d xx c COPY select from table TO program split lines 1000 f
  • 在 Sql Server 中启用 DTD 支持

    我有各种 xml 文档需要存储在数据库列中 这些文档包含对 DTD 的引用 并且 SQL Server 不会导入 xml 因为它存在安全风险 如何在数据库上启用 DTD 支持 以便它可以让我插入 xml 内容 你必须CONVERT首先 MS
  • 关系代数 - 笛卡尔积与自然连接?

    我正在准备考试 但未能找到一个可靠的标准来确定笛卡尔积是否x要使用或者如果自然连接 X 是要使用的 我想出了一个粗略的指南 如果您需要投影与要连接的表中的属性同名的属性 则必须使用x并说明要投影的表名称 tableA colname1 ta
  • SqlAlchemy:查询具有数组的长度json字段

    我有一个包含 JSON 类型字段的表 JSON 字段包含一个带有数组的 JSON 对象 如何查询该数组每一行的长度 class Post Base tablename posts id Column Integer primary key
  • Psycopg / Postgres:连接随机挂出

    我正在使用 psycopg2 作为我当前正在开发的cherrypy 应用程序 并使用 cli 和 phpgadmin 来手动处理一些操作 这是Python代码 One connection per thread cherrypy threa
  • MySql 复合索引

    我们使用 MySql 作为我们的数据库 以下查询在 mysql 表 大约 2500 万条记录 上运行 我在这里粘贴了两个查询 查询运行得太慢 我想知道更好的复合索引是否可以改善这种情况 你知道最好的综合指数是什么吗 并建议我这些查询是否需要
  • PLSQL 中的时区转换

    我需要将系统日期和时间转换为特定时区 例如东部时间 我无法假设我当前的时区 如何在plsql中转换它 请帮我 假设你有一个TIMESTAMP WITH TIME ZONE 例如systimestamp 您可以使用AT TIME ZONE句法
  • 如何在没有聚合函数的情况下在sql server中创建枢轴查询

    我正在使用 MS SQL SERVER 2008 并且有以下数据 select from account PERIOD ACCOUNT VALUE 2000 Asset 205 2000 Equity 365 2000 Profit 524

随机推荐

  • Re.sub 不适合我

    我想得到re sub例如替换用值指定的模式 for lines in f pattern 2 key 0 2 re search pattern lines 这将返回找到模式的行 例如 这是测试返回之一 这是一个 测试 我遇到的问题是当我执
  • 使用 PHP 检查远程文件是否为格式良好的 XML

    我有一个 PHP 驱动的网站 其中包含 XML 库存提要 该提要由 ASP 远程提供 即 XML 提要 url 的顺序为 http remote com client asp 由于提要经常不可用 我的意思是网站返回 ASP 错误 我想在包含
  • memcpy 与 C 中的赋值——应该是 memmove?

    正如指出的这个问题的答案 编译器 在本例中是 gcc 4 1 2 是的 它很旧 不 我无法更改它 可以在它认为合适的地方用 memcpy 替换结构体赋值 我正在 valgrind 下运行一些代码 并收到有关 memcpy 源 目标重叠的警告
  • 在Java中,为什么超类方法不能从子类实例访问受保护或私有方法/变量?

    让我们从另一种行为开始 即使您将方法 变量声明为私有 同一类的另一个实例也可以访问它 没关系 我可以忍受 我将这些称为类私有而不是实例私有 现在问题部分 例如 在运行时我希望能够检查所有字符串变量thisclass 不为 null 如果为
  • junit 3 中的类拆解?

    我们有很多使用 JUnit 编写的集成测试3 尽管我们现在运行它们4 4 其中一些需要在类中的所有测试完成后运行的tearDown 方法 以释放一些公共资源 我发现这可以在 junit 4 中使用 AfterClass org junit
  • 在 SQL 中将列转换为行[重复]

    这个问题在这里已经有答案了 我需要编写一个查询 该查询获取行并将其转换为列 这是我的表 Count fname lname id 1 abc def 20 2 pqr 20 3 abc xyz 20 4 xyz xyz 20 1 abc d
  • git 的耐心差异算法的实现是否正确?

    Stackoverflow 上的这个问题似乎是应用耐心差异算法的良好候选者 然而 在测试我的潜在答案时 我发现git diff patience没有达到我的预期 并且在这种情况下 与默认的 diff 算法没有什么不同 cat a Funct
  • Android 中如何检查数据库是否存在?

    我正在使用 Room API 在我的 Android 应用程序中实现数据库 似乎每次我加载应用程序时 它都会尝试一次又一次地创建数据库 有什么办法可以限制这个吗 db Room databaseBuilder context AppData
  • 在Android中启用MultiDex支持以在Eclipse中实现65K+方法

    我正在尝试在 eclipse 中构建 Multidex apk 但未能成功 我尝试了以下步骤 在 Android 应用程序中配置 Multidex 支持 我已将位于 extras android support multidex 的 Mul
  • 带有滚动视图的 Android 操作栏选项卡在方向更改后复制了视图

    我有一个非常简单的代码 我将操作栏与选项卡片段一起使用 加载后它工作正常 但方向改变后它会变得疯狂 旧片段也可见 为什么 Sorry for Hungarian texts on the image but I hope it doesn
  • 当浏览器以角度关闭时清除本地存储

    我创建了一个 Angular 5 应用程序 它使用基于令牌的系统 当前我将令牌存储在本地存储中 我希望本地存储在浏览器关闭时保持清晰 并且在浏览器刷新时不清除本地存储 我没有使用sessionstorage的原因是因为在新选项卡或窗口中打开
  • 将第一行与数据框中的列标题合并

    我正在尝试清理 Excel 文件以进行进一步的研究 我遇到的问题是 我想合并第一行和第二行 我现在拥有的代码 xl pd ExcelFile nanonose xls df xl parse Sheet1 df df drop Unname
  • 浏览器滚动条移位

    当您转到我的网站上有额外内容的页面时 滚动条出现在右侧 但我的内容有明显的向左移动 您可以通过单击主页 托管并再次返回我的网站 www ipalaces org 来注意到这一点 如何解释页面上的浏览器滚动条 我可以让滚动条至少始终可见吗 我
  • 调试 ASP.NET Core 时看不到值

    使用 Visual Studio 2015 调试 ASP NET Core 应用程序时 我无法看到变量 参数和字段值 例如 将鼠标悬停在这些值上 我也无法将它们添加到手表中 我正在调试中运行 我们可能已经找到了问题的解决方案 或至少是解决方
  • 如何将对象转换为其实际类型?

    如果我有 void MyMethod Object obj 我怎样才能投obj它的实际类型是什么 如果您知道实际类型 那么只需 SomeType typed SomeType obj typed MyFunction 如果您不知道实际类型
  • 使用 tkinter 制作简单动画

    我有一个简单的代码来使用 tkinter 可视化一些数据 按钮单击绑定到重绘下一个数据 帧 的函数 但是 我希望能够选择以一定的频率自动重绘 我对 GUI 编程非常陌生 我不需要为这段代码做很多事情 所以我的大部分 tkinter 知识都来
  • 为什么 Apache Flink 需要 Watermarks 进行事件时间处理?

    有人可以正确解释事件时间戳和水印吗 我从文档中理解了它 但不是那么清楚 现实生活中的例子或外行定义会有所帮助 另外 如果可能的话请给出一个示例 以及一些可以解释它的代码片段 提前致谢 这是一个示例 说明了为什么我们需要水印以及它们的工作原理
  • 在循环内启动任务:如何传递可以在循环内更改的值? [复制]

    这个问题在这里已经有答案了 我正在尝试在 while 循环内使用 TPL 并且需要将一些值传递给任务 然后这些值会更改为循环 例如 这里显示了一个索引递增的示例 必须在请求创建任务的行之后 int index 0 Task tasks wh
  • 每个类型的自定义 Json.NET 序列化器设置

    我正在使用 ApiController 它使用全局 HttpConfiguration 类来指定 JsonFormatter 设置 我可以非常轻松地全局设置序列化设置 如下所示 config Formatters JsonFormatter
  • 重复的 postgresql 模式,包括序列

    我的数据库布局需要为每个新客户创建新架构 目前我使用在网上找到的内部函数并进行了一些修改 CREATE FUNCTION copy schema source schema character varying target schema c