【问题标题】:Create primary key with two columns创建具有两列的主键
【发布时间】:2018-11-09 04:54:25
【问题描述】:

我有两张桌子,bank_datasec_data。表bank_data 具有列iddateassetliabilitydate 列分为四等分。

  id    | date     |  asset    | liability           
--------+----------+--------------------
 1      | 6/30/2001|    333860 | 308524
 1      | 3/31/2001|    336896 | 311865
 1      | 9/30/2001|    349343 | 308524
 1      |12/31/2002|    353863 | 322659
 2      | 6/30/2001|    451297 | 425156
 2      | 3/31/2001|    411421 | 391846
 2      | 9/30/2001|    430178 | 41356
 2      |12/31/2002|    481687 | 46589
 3      | 6/30/2001|    106506 | 104532
 3      | 3/31/2001|    104196 | 102983
 3      | 9/30/2001|    106383 | 104865
 3      |12/31/2002|    107654 | 105867 

sec_data 具有iddatesecurity 列。我使用以下代码在 R 中将这两个表组合成一个名为 new_table 的新表:

dbGetQuery(con, "CREATE TABLE new_table
         AS (SELECT sec_data.id, 
         bank_data.date, 
         bank_data.asset, 
         bank_data.liability, 
         sec_data.security
         FROM bank_data,bank_sec
         WHERE (bank_data.id = sec_data.id) AND
         (bank_data.date = sec_data.date)")

我想在这个 R 代码中设置两个主键(iddate)而不使用 pgAdmin。我想使用 Constraint bankkey Primary Key (id, date) 之类的东西,但 ASSELECT 函数让我失望。

【问题讨论】:

  • 这不是 R 问题,而是 SQL 问题。你应该可以使用ALTER TABLE 之类的东西来做到这一点。 (顺便说一句,当您的查询没有返回任何内容时,您应该使用 dbExecute,就像在您的 create table 查询中一样。)
  • sec_data?您分配bank_sec,不使用implicit join,而是使用复合primary key,如alter table new_table add primary key(id,date)
  • 一张表最多只能有一个主键 - 你的意思是一个主键由两列组成

标签: sql postgresql ddl composite-primary-key


【解决方案1】:

首先你的查询是错误的。你说的是表sec_data,但你分配了表bank_sec,我改写你的查询

CREATE TABLE new_table AS 
    SELECT 
       sec_data.id, 
       bank_data.date, 
       bank_data.asset, 
       bank_data.liability, 
       sec_data.security
    FROM bank_data
         INNER JOIN sec_data on bank_data.id = sec_data.id
                             and bank_data.date = sec_data.date

避免使用Implicit Join 并改用Explicit Join。正如@a_horse_with_no_name 所述,您不能在1 个表中定义超过1 个主键。所以你做的是Composite Primary Key

定义:

是表中两列或多列的组合,可用于 唯一标识表中的每一行

所以你需要Alter Function 因为你的创建语句基于其他表..

ALTER TABLE new_table
   ADD PRIMARY KEY (id, date);

【讨论】:

    【解决方案2】:

    您可以运行这两个单独的语句(create tableInsert into

    CREATE TABLE new_table ( 
           id int, date date, asset int, liability int, security int,
            CONSTRAINT bankkey PRIMARY KEY (id, date)
               ) ;
    
    
    INSERT INTO new_table (id,date,asset,liability,security)
            SELECT s.id, 
               b.date, 
               b.asset, 
               b.liability, 
               s.security
             FROM bank_data b JOIN bank_sec s
             ON b.id = s.id AND b.date = s.date;
    

    Demo

    【讨论】:

      【解决方案3】:

      要创建所需的主键,请在 CREATE TABLE ... AS 语句之后运行以下 SQL 语句:

      ALTER TABLE new_table
         ADD CONSTRAINT bankkey PRIMARY KEY (id, date);
      

      这样做的好处是主键索引不会拖慢数据插入速度。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-30
        • 1970-01-01
        • 1970-01-01
        • 2015-03-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多