【问题标题】:How to create a table that is linked to another table如何创建链接到另一个表的表
【发布时间】:2016-01-17 18:23:26
【问题描述】:

我想知道这是否可能,创建一个链接到另一个现有表的表。

所以我有一个已经有 30 列的用户表。为了防止它太大,我想创建一个名为 user_data 的新表。这将包含用户年龄、生日等信息。

我的问题是您能否创建一个链接到另一个表的表(通过表 ID)。并且是否可以由于现有 ID 自动创建所有行。

我正在使用 ruby​​ rails 和 postgresql。在这些平台上可以做这样的事情吗?我是数据库新手,所以我不知道是否存在这样的东西。

【问题讨论】:

  • 我刚刚看到我没有正确阅读您的问题,And can all rows be automatically created due to existing ID. 是什么意思然后我会更正我的答案

标签: ruby-on-rails database postgresql


【解决方案1】:

最简单的方法是设置has_one belongs_to 关联。 所以一个用户has_one user_data 记录和一个user_data 记录belongs_to 一个用户。 因此,您必须在 user_data 记录中插入用户记录的 primary_key 作为 foreign_key。这里有一些很好的阅读材料

http://edgeguides.rubyonrails.org/active_record_migrations.html#foreign-keys

迁移应该看起来像这样,以将用户密钥添加到 user_data 表:

class AddForeignKey < ActiveRecord::Base
 def self.up
   add_foreign_key :user_data_sets, :users
 end
 def self.down
   remove_foreign_key :user_data_sets, :users
 end
end

【讨论】:

    【解决方案2】:

    一个简单的表格。

    CREATE TABLE employee(
       employee_id int4 serial primary key,
       first_name varchar(40) NOT NULL,
       last_name varchar(40) NOT NULL,
       updated timestamp(6) NOT NULL DEFAULT now()
    );
    

    一对一的额外信息表。这些通常包含相关但不重要的信息。其中可以有几个。 一对一的关系是由唯一的外键引用创建的。

    CREATE TABLE employee_extra (
       employee_extra_id int4 serial primary key,
       employee_id int4 NOT NULL UNIQUE REFERENCES employee(employee_id),
       birthday timestamp(6) NULL,
       updated timestamp(6) NOT NULL DEFAULT now()
    );
    

    创建一个触发器以在创建原始表时填充额外的表。

    CREATE OR REPLACE FUNCTION employee_after_insert_trigger() RETURNS TRIGGER AS $emp_trigger$
        BEGIN
            --
            -- Create a row in employee_extra matching the just created row in employee
            --
            INSERT INTO employee_extra (employee_id, updated) SELECT employee_id, updated FROM NEW;
            RETURN NEW;
        END;
    
    $emp_trigger$ LANGUAGE plpgsql;
    
    CREATE TRIGGER employee_after_insert
      AFTER UPDATE
      ON employee
      FOR EACH ROW
      EXECUTE PROCEDURE employee_after_insert_trigger();
    

    没有尝试过,但它或类似的东西应该可以工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-22
      • 2019-06-02
      • 1970-01-01
      • 1970-01-01
      • 2021-07-23
      • 1970-01-01
      • 1970-01-01
      • 2022-07-29
      相关资源
      最近更新 更多