2015-01-20 22 views
0

當我嘗試複製臨時表Tperson中的數據時,它嘗試複製所有數據,並且某些數據在Customer.PersonID中沒有匹配的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); 

我希望它只複製在兩個表中都有匹配personID的數據。這就是我認爲WHERE子句會做的事情,但事實並非如此。 因此,歡迎任何有關我的代碼的答案或任何建議/提示。

+1

您的插入不會爲列'customerid'提供值,並且列未定義爲具有默認值,這意味着您要將「null」值放入該列中 – 2015-01-20 19:11:46

+0

表客戶已具有CustomerID的值,PersonID,因爲 COPY Customer(CustomerID,PersonID)FROM'C:\ Users \ DieCriminal \ Desktop \ data \ Customer.txt'CSV HEADER; 我想要做的插入是將值添加到其餘列Tperson.PersonID匹配Customer.PersonID。 我的插入不應該爲列CustomerID提供值。 – DieCriminal 2015-01-20 19:17:45

+2

但是你**插入**新行,你沒有更新現有的行。 – 2015-01-20 19:21:36

回答

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,他basicly解決了我的problem.Thanks。