将表列移动到新表并在 PostgreSQL 中作为外键引用

2023-12-26

假设我们有一个包含字段的数据库表

"id", "category", "subcategory", "brand", "name", "description", etc. 

创建单独的表的好方法是什么category, subcategory and brand以及原始表中相应的列和行成为外键引用?

概述所涉及的操作:

  • 获取原始表的每一列中应成为外键的所有唯一值;
  • 为这些创建表
  • 在原始表(或副本)中创建外键引用列

在本例中,PostgreSQL 数据库是通过 Ruby 应用程序中的 Sequel 访问的,因此可用的接口有命令行、Sequel、PGAdmin 等...

问题是:你会怎么做?


        -- Some test data
CREATE TABLE animals
        ( id SERIAL NOT NULL PRIMARY KEY
        , name varchar
        , category varchar
        , subcategory varchar
        );
INSERT INTO animals(name, category, subcategory) VALUES
 ( 'Chimpanzee' , 'mammals', 'apes' )
,( 'Urang Utang' , 'mammals', 'apes' )
,( 'Homo Sapiens' , 'mammals', 'apes' )
,( 'Mouse' , 'mammals', 'rodents' )
,( 'Rat' , 'mammals', 'rodents' )
        ;

        -- [empty] table to contain the "squeezed out" domain
CREATE TABLE categories
        ( id SERIAL NOT NULL PRIMARY KEY
        , category varchar
        , subcategory varchar
        , UNIQUE (category,subcategory)
        );

        -- The original table needs a "link" to the new table
ALTER TABLE animals
        ADD column category_id INTEGER -- NOT NULL
        REFERENCES categories(id)
        ;
        -- FK constraints are helped a lot by a supportive index.
CREATE INDEX animals_categories_fk ON animals (category_id);

        -- Chained query to:
        -- * populate the domain table
        -- * initialize the FK column in the original table
WITH ins AS (
        INSERT INTO categories(category, subcategory)
        SELECT DISTINCT a.category, a.subcategory
        FROM animals a
        RETURNING *
        )
UPDATE animals ani
SET category_id = ins.id
FROM ins
WHERE ins.category = ani.category
AND ins.subcategory = ani.subcategory
        ;

        -- Now that we have the FK pointing to the new table,
        -- we can drop the redundant columns.
ALTER TABLE animals DROP COLUMN category, DROP COLUMN subcategory;

        -- show it to the world
SELECT a.*
        , c.category, c.subcategory
FROM animals a
JOIN categories c ON c.id = a.category_id
        ;

注:片段:

WHERE ins.category = ani.category AND ins.subcategory = ani.subcategory

如果这些列包含 NULL,将会导致问题。 最好使用它们进行比较

(ins.类别,ins.子类别) 与以下没有什么不同 (ani.类别,ani.子类别)

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

将表列移动到新表并在 PostgreSQL 中作为外键引用 的相关文章

  • Postgres JSON 数据类型 Rails 查询

    我正在使用 Postgres 的 json 数据类型 但想要使用嵌套在 json 中的数据进行查询 排序 我想在 json 数据类型上使用 where 进行订购或查询 例如 我想查询关注者数量 gt 500 的用户 或者我想按关注者或关注数
  • postgreSQL 在 WAMP 上的集成

    我刚刚在 Windows 7 上安装了 postgreSQL 我正在尝试将 postgreSQL 与 WAMP 服务器集成 为此 我在 httpd conf 和 php ini 文件中进行了以下更改 1个加载模块c path to libp
  • 标量子查询包含多行

    我正在使用 H2 数据库并想要移动一些数据 为此 我创建了以下查询 UPDATE CUSTOMER SET EMAIL SELECT service EMAIL FROM CUSTOMER SERVICE AS service INNER
  • SQL Server 2008 错误 233

    我正在使用以下 sql 脚本在 SQL Server 2008 中创建新登录名 CREATE LOGIN xyz WITH PASSWORD xyz DEFAULT DATABASE master DEFAULT LANGUAGE us e
  • 以编程方式插入行(父行和子行)

    我正在使用 Spring 和 JDBCTemplate 该场景是 CUSTOMER 表和 ORDERS 表的父子关系 我想做一个插入 例如 1 个客户和 5 个订单 但我不确定如何以编程方式在 CUSTOMER 表中插入一行 如何获取 Or
  • 如何在 Django QuerySet 中将 DateField() + TimeField() 转换为本地时间?

    我的模型为这些字段 date models DateField 开始时间 models TimeField 结束时间 models TimeField 我想用以下方式注释查询集start datetime and end datetime
  • 需要 SQL 查询澄清[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有一个由以下列组成的表 billid patientid doctorid fees 如何显示治疗多名患者的医生 尝试了以下代码并得到了
  • 如何从 Ruby 中的特定相对路径加载文件?

    我正在制作一颗供内部使用的宝石 在其中 我从另一个目录加载一些 YAML in
  • Rails/Ruby 合并两个具有相同键、不同值的哈希值

    我有两个想要合并的哈希值 它们看起来像这样 Hello gt 3 Hi gt 43 Hola gt 43 第二个哈希看起来像 Hello gt 4 Hi gt 2 Bonjour gt 2 我想合并这两个哈希数组 使结果看起来像 Hello
  • 如何在Django项目中使用PostgreSQL的存储过程或函数

    我正在开发一个 Django 项目 我决定在 PostgreSQL 中编写逻辑代码 而不是用 Python 编写 因此 我在 PostgreSQL 中创建了一个存储过程 例如 存储过程如下所示 create or replace proce
  • Snowflake 中的动态 SQL

    当我在雪花中运行动态 SQL 时 遇到以下错误 未完成对 SQL MAIN 的分配 因为值超出了变量的大小限制 它的大小是263 限制为 256 内部存储大小以字节为单位 这是代码 SET v G 1 SET v G1 v G VARCHA
  • 将两个表合并为一个输出

    假设我有两张表 已知营业时间 ChargeNum CategoryID Month Hours 111111 1 2 1 09 10 111111 1 3 1 09 30 111111 1 4 1 09 50 222222 1 3 1 09
  • H2 SQL 日期比较

    在 H2 数据库中 如何在 TIMESTAMP 类型的列上运行查询 SELECT FROM RECORDS WHERE TRAN DATE lt 2012 07 24 Try 2012 07 24
  • 什么是适合 Rails 3 的测试框架?

    去年我一直在使用 Ruby On Rails 但是 无法进行单元测试 现在我必须编写单元测试代码 哪个测试框架好 为什么 有这方面的好的教程吗 我的系统配置 Ruby 1 9 2 Rails 3 Ubuntu 10 第一个技巧是 尝试升级到
  • SQL 使用另一列的键和最大值设置列

    我需要根据同一 ID 的 duration 列的最大值更新 max register 列 将值设置为 1 其他值设置为 0 初始表 Id duration max register 1 0 0 1 7 0 1 3 0 2 10 0 2 5
  • IIF(...) 不是公认的内置函数

    我正在尝试在 Microsoft SQL Server 2008 R2 中使用它 SET SomeVar SomeOtherVar IIF SomeBool value when true value when false 但我收到一个错误
  • 正则表达式的 o 修饰符是什么意思?

    Ruby 正则表达式有一些选项 例如i x m o i例如 意味着忽略大小写 什么是o选项是什么意思 在ri Regexp 它说o意味着执行 仅插值一次 但是当我这样做时 a one b a a two b不改变 它保持 one 我缺少什么
  • WHERE NOT EXIST 附近的语法错误

    我在堆栈中搜索 但没有一个达到最终答案 我的查询是这样的 INSERT INTO user username frequence autoSend VALUES feri2 3 1 WHERE NOT EXISTS SELECT FROM
  • 更改mysql数据库表中的日期格式

    大家早上好 只是一个简单的问题 在我现有的 MySql 数据库中 我几乎没有包含日期 的列 目前这些是年 月 日格式 但现在我需要将其全部更改为年 月 日格式 我试过了select date format curdate d m Y 但它不
  • 使用 ruby​​ 调整动画 GIF 图像的大小?

    我正在尝试将 GIF 图像调整为不同的尺寸 我在 ruby 中使用 RMagick 库 但对于某些 gif 图像 即使我缩小 GIF 的大小 文件大小似乎也会增加 我正在以相同的纵横比调整图像图像的大小 这是我的代码 require rma

随机推荐

  • 如何逐行读取文本区域 HTML 标记

    我有一个文本区域 其中每行都包含整数值 如下所示 1234 4321 123445 我想检查用户是否确实输入了有效值 而不是一些有趣的值 如下所示 1234 987l 为此 我需要逐行读取文本区域并验证它 如何使用 javascript 逐
  • Flutter Android 警报管理器不工作

    我已经安装了Android 闹钟管理器 https pub dartlang org packages android alarm manager按照链接中的说明将插件添加到我的 Flutter v1 0 0 应用程序中 但是当我尝试使用A
  • 无法在ubuntu v-20.04.1中安装nodejs

    我正在尝试使用此命令安装 nodejs 版本 14 15 4 apt install nodejs 14 15 4 但我收到这个错误 E 找不到 nodejs 的版本 14 15 4 我在这个命令中犯了什么错误 或者有什么更好的安装方法吗
  • 如何修复 Angular 6 中文件上传时出现的 415 不支持的媒体类型

    我负责 Net Core Web Api 和 Angular 应用程序 我创建了一个控制器 它将图像链接到数据库中的项目 HttpPut Action id public async Task
  • 如何对UDP协议进行拥塞控制?

    我有一个自定义的 UDP 协议 具有多个发送器 接收器 旨在尽可能快地发送大文件 它是基于客户端 服务器的 如何检测 LAN 上的拥塞情况以降低 UDP 数据包的发送速率 编辑 请不要评论UDP的使用是否合适 该协议使用 UDP 但在数据包
  • Java 中的 DI 没有注释?

    有没有什么方法 现有框架 可以在 Java 中配置 DI 而不必向 不属于 的类添加注释 在我的研究中 看起来要完成构造函数注入 我们需要向构造函数添加一些注释 如下所示 Inject or Autowired for Spring Boo
  • 无法对“XMLHttpRequest”执行“发送”

    我正在开发一个使用ajax 的Cordova 应用程序 我的问题是 在调试中 应用程序正在运行 但是当我构建一个版本时 我收到了错误 readyState 0 status 0 statusText NetworkError Failed
  • 如何使 type="number" 只为正数

    目前我有以下代码
  • 在 TeamCity 构建步骤中获取构建作业 URL

    我有一个 Microsoft Teams Webhook 当 TeamCity 构建失败时它会提醒我 我想知道如何获取当前 TeamCity 版本的 URL 以便可以将此信息传递到我的 webhook 仅使用手头的参数 您就可以将 uri
  • 如何使用 Ajax 和 Jquery 从 PHP 数据库中提取信息,并使用该信息填充元素?

    我正在调整一个网站 以便员工更轻松地编辑产品 现在 必须有人登录数据库并更改价格 然后必须有人更改网站本身的物理 html 因此 我正在编写代码 从数据库中提取所有产品 并将它们显示在可以编辑的页面上 我认为用 Ajax 来做所有事情都是最
  • 阻止 Word 2010 保存 o:gfxdata base64 或 uuencoded VML?

    我正在处理包含多个绘图画布的 docx 文件 其中插入了图像以及在 Word 2010 中绘制的一些线条和箭头 我使用的是没有兼容模式的 2010 格式 Word 插入一个o gfxdata属性到每个v shape and v group元
  • ORA-01400: 无法将 null 插入 (TABLE.COLUMN)(休眠)

    我正在使用 hibernate 4 3 oracle 11 当我想插入一个员工时 它与类别有一对多的关系 一个类别有很多员工 首先我将一个类别插入数据库 然后我尝试将一个员工插入数据库并得到一个异常 实体的代码是由hibernate生成的
  • 如何在 PowerShell 中标准化路径?

    我有两条路 fred frog and frag 我可以在 PowerShell 中将它们连接在一起 如下所示 join path fred frog frag 这给了我这个 fred frog frag 但我不想要这样 我想要一个没有双点
  • Android - 具有多个底部导航菜单的导航组件

    我有一个 Android 应用程序 Java 它使用导航组件来设置底部导航 该应用程序由一个活动 主 组成 其他所有内容都以片段形式加载 这个想法是让启动屏幕启动并检查用户是否登录 如果用户登录 则加载主屏幕并且底部导航 之前隐藏 变得可见
  • C# - 编译器错误 - 将 int[] 分配给 object[] 时

    namespace ConsoleApplication1 class Program static void Main string args object obj new object 3 obj 0 new object obj 1
  • 为什么在 c 中嵌入 python 时无法导入“math”库?

    我正在使用 python 2 6 文档中的示例开始尝试在 C 中嵌入一些 python C 代码示例 http docs python org extending embedding html pure embedding不允许我执行以下
  • 设置可选的禁用属性

    我想禁用表单中的所有字段 这些字段在加载页面时具有值 例如在这个 td Html TextBoxFor m gt m PracticeName new style width 100 disabled Model PracticeName
  • Windows 8 上的 WP7 SDK

    是否可以在 Windows 8 Release Preview 上安装 WP7 SDK 我尝试使用标准安装包 http www microsoft com en us download details aspx id 29233但不断收到以
  • 如何使用fortran读取不规则行

    我有一个格式如下的文本文件 1 2 3 4 5 6 7 对于许多行等等 我运行这个 fortran 程序 i 1 tt 1 do while true read unit 1 IOSTAT status lon i tt lat i tt
  • 将表列移动到新表并在 PostgreSQL 中作为外键引用

    假设我们有一个包含字段的数据库表 id category subcategory brand name description etc 创建单独的表的好方法是什么category subcategory and brand以及原始表中相应的