我正在努力编写从一个表到另一个表的迁移。我有一张桌子vault
。现在,我创建了一个新表company
。 vault
表包含一些有关“公司”的数据,我现在要“移动”到特定的company
表中。
Company
可以有多个Vault
,并且始终至少有一个Vault
。 Vault
都恰好引用了一家公司。 company
引用了master_vault
,名称为“ {Master}。Vault
。所以我想编写一个迁移,该迁移将用company
中的数据填充新的Vault
表,并将公司的master_vault
设置为名称为“大师”。
我尝试过类似的事情。
CREATE TABLE company (
id VARCHAR NOT NULL,
created_at TIMESTAMP NOT NULL,
updated_at TIMESTAMP NOT NULL,
master_vault_id VARCHAR NOT NULL,
company_name VARCHAR NULL,
country VARCHAR(2) NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (master_vault_id) REFERENCES vault (id)
);
INSERT INTO company (id, created_at, updated_at, master_vault_id, company_name, country)
SELECT company_id, NOW(), NOW(), id, company_name, country
FROM vault
WHERE vault.name = 'Master';
但是,此迁移失败:
ERROR: duplicate key value violates unique constraint \"company_pkey\"\n Detail: Key (id)=(123456) already exists
我做错了什么?有人请帮助我使用此SQL。
答案 0 :(得分:1)
每个公司可以拥有多个保险柜,并且始终至少有一个保险柜。
这意味着您的vault.company_id
表中的vault
有多个值。因此,您只需要从ID列中获取不同的值即可。
要仅从库表中选择一个company_id,可以使用PostgreSQL的distinct on ()
运算符:
INSERT INTO company (id, created_at, updated_at, master_vault_id, company_name, country)
SELECT DISTINCT ON (company_id) company_id, NOW(), NOW(), id, company_name, country
FROM vault
WHERE vault.name = 'Master'
ORDER BY company_id;
答案 1 :(得分:0)
错误:重复的键值违反了唯一约束
您的错误提到存在按键冲突。您已将id
声明为不允许重复值的主键。
123456 ,因此您将无法再次在该列中插入相同的值。