使用两列创建主键

Create primary key with two columns

我有两个 table,bank_datasec_data。 Table 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 

Table sec_dataiddatesecurity 列。我使用以下代码在 R 中将两个 table 组合成一个名为 new_table 的新 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)")

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

您可以 运行 这两个单独的语句(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

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

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

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

首先你的查询是错误的..你说 table sec_data 但你分配 table 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 table 中定义超过 1 个主键。所以你所做的是 Composite Primary Key

定义:

is a combination of two or more columns in a table that can be used to uniquely identify each row in the table

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

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