SQL根据条件将数据从一个表迁移到另一个表

我正在努力编写从一个表到另一个表的迁移。我有一张桌子vault。现在,我创建了一个新表companyvault表包含一些有关“公司”的数据,我现在要“移动”到特定的company表中。

  1. 每个Company可以有多个Vault,并且始终至少有一个Vault
  2. 每个Vault都恰好引用了一家公司。
  3. 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(),id,country
FROM vault
WHERE vault.name = 'Master';

但是,此迁移失败:

ERROR: duplicate key value violates unique constraint \"company_pkey\"\n  Detail: Key (id)=(123456) already exists

我做错了什么?有人请帮助我使用此SQL。

xk0218 回答:SQL根据条件将数据从一个表迁移到另一个表

  

每个公司可以拥有多个保险柜,并且始终至少有一个保险柜。

这意味着您的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(),id,country
FROM vault
WHERE vault.name = 'Master'
ORDER BY company_id;

在线示例:https://rextester.com/AROU80315

,
  

错误:重复的键值违反了唯一约束

您的错误提到存在按键冲突。您已将id声明为不允许重复值的主键。

表中已经存在

123456 ,因此您将无法再次在该列中插入相同的值。

本文链接:https://www.f2er.com/3161553.html

大家都在问