我有两个表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
。我使用以下代码将两个表合并到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代码中设置两个主键(id
和date
)而不使用pgAdmin。我想使用类似Constraint bankkey Primary Key (id, date)
的东西,但是AS
和SELECT
函数让我失望。
答案 0 :(得分:2)
您可以运行这两个单独的语句(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;
答案 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);
优点是主键索引不会减慢数据插入速度。