Создать первичный ключ с двумя столбцами - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть две таблицы, bank_data и sec_data. Таблица bank_data содержит столбцы id, date, asset и liability. Столбец 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 имеет столбцы id, date и security. Я объединил две таблицы в новую таблицу с именем new_table в R, используя этот код:

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)")

Я хотел бы установить два первичных ключа (id и date) в этом коде R без использования pgAdmin. Я хочу использовать что-то вроде Constraint bankkey Primary Key (id, date), но функции AS и SELECT сбивают меня с толку.

Ответы [ 3 ]

0 голосов
/ 09 ноября 2018

Чтобы создать желаемый первичный ключ, запустите следующую инструкцию SQL после вашей инструкции CREATE TABLE ... AS:

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

Преимущество заключается в том, что индекс первичного ключа не замедляет вставку данных.

0 голосов
/ 09 ноября 2018

Сначала ваш запрос неверен. Вы говорите «таблица» 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);
0 голосов
/ 09 ноября 2018

Вы можете запустить эти два отдельных оператора (create table и Insert 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;

Демо

...