用两列创建主键

时间:2018-11-09 04:54:26

标签: sql postgresql ddl composite-primary-key

我有两个表bank_datasec_data。表bank_data具有列iddateassetliability的列。 date列分为四分之一。

  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函数让我失望。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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个表中定义多个主键。所以你要做的是Composite Primary Key

定义:

  

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

因此您需要Alter Function,因为您的create语句基于其他表。

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

答案 2 :(得分:0)

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

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

优点是主键索引不会减慢数据插入速度。