2015-01-20 3 views
0

Когда я пытаюсь скопировать данные из моей временной таблицы Tperson, он пытается скопировать все данные, а некоторые данные не имеют соответствующего PersonID в Customer.PersonID.PostgreSQL Копирование данных (пытается скопировать данные, которые не соответствуют WHERE)

DROP TABLE IF EXISTS Tperson; 

COPY Customer (CustomerID,PersonID) FROM 'C:\Users\DieCriminal\Desktop\data\Customer.txt' CSV HEADER; 

CREATE TEMPORARY TABLE Tperson(PersonID integer,Title text,FirstName text,LastName text); 
COPY Tperson FROM 'C:\Users\DieCriminal\Desktop\data\Person.txt' CSV HEADER; 

INSERT INTO Customer (Person.PersonID,Person.Title,Person.FirstName,Person.LastName) 
SELECT Tperson.PersonID,Tperson.Title,Tperson.FirstName,Tperson.LastName 
From Tperson,Customer 
WHERE Customer.PersonID = Tperson.PersonID; 

SELECT * 
FROM Customer; 

Так заканчивается так:

ERROR: null value in column "customerid" violates not-null constraint 
DETAIL: Failing row contains (null, null, (291,Mr.,Gustavo,Achong,)). 
********** Error ********** 

ERROR: null value in column "customerid" violates not-null constraint 
SQL state: 23502 
Detail: Failing row contains (null, null, (291,Mr.,Gustavo,Achong,)). 

Также здесь являются таблицы/типы: (некоторые таблицы/типы будут изменены после загрузки данных)

CREATE TABLE Customer(
CustomerID integer, 
PersonID integer, 
Person PersonType, 
PRIMARY KEY(CustomerID)); 

CREATE TYPE PersonType AS(
PersonID integer, 
Title text, 
FirstName text, 
LastName text, 
Address AddressType[]); 

CREATE TYPE AddressType AS(
AddressID integer, 
AddressLine1 text, 
AddressLine2 text, 
City text, 
PostalCode text); 

I хотите, чтобы он копировал только данные, имеющие соответствующие идентификаторы personID в обеих таблицах. Это то, что я думал, что предложение WHERE будет, но это не так. Так что любой ответ или любое предложение/отзыв о моем коде приветствуются.

+1

В вашей вкладке не указано значение для столбца 'customerid', а в столбце не указано значение по умолчанию, что означает, что вы пытаетесь поместить значение« null »в этот столбец –

+0

Таблица Клиент уже имеет значения для CustomerID , PersonID, потому что Клиент COPY (CustomerID, PersonID) FROM 'C: \ Users \ DieCriminal \ Desktop \ data \ Customer.txt' CSV HEADER; Что я хочу делать с вставкой, это добавить значения в остальные столбцы, где Tperson.PersonID соответствует Customer.PersonID. Моя вставка не должна указывать значение для идентификатора столбца CustomerID. – DieCriminal

+2

Но вы ** вставляете ** новые строки, вы не обновляете существующие. –

ответ

0

Так что, похоже, я сейчас глуп и устал читать. Я забыл, что INSERT применяется к новым строкам, и мне нужно ОБНОВЛЕНИЕ, потому что мне нужно изменить существующие строки.

Это работало отлично:

DROP TABLE IF EXISTS Tperson; 

COPY Customer (CustomerID,PersonID) FROM 'C:\Users\DieCriminal\Desktop\data\Customer.txt' CSV HEADER; 

CREATE TEMPORARY TABLE Tperson(PersonID integer,Title text,FirstName text,LastName text); 
COPY Tperson FROM 'C:\Users\DieCriminal\Desktop\data\Person.txt' CSV HEADER; 

UPDATE Customer 
SET (Person.PersonID,Person.Title,Person.FirstName,Person.LastName) = (Tperson.PersonID,Tperson.Title,Tperson.FirstName,Tperson.LastName) 
From Tperson 
WHERE Customer.PersonID = Tperson.PersonID; 

SELECT * 
FROM Customer; 

Кредиты на: a_horse_with_no_name, он основно решил мои problem.thanks.

Смежные вопросы