【发布时间】:2015-03-26 06:55:04
【问题描述】:
因此,我尝试将临时表中的值复制到具有数组类型的表中,但出现以下错误,我找不到解决方法。
ERROR: cannot assign to field "addressid" of column "address" because its type addresstype[] is not a composite type
LINE 32: ...nID,Person.Title,Person.FirstName,Person.LastName,Person.Add...
^
********** Error **********
ERROR: cannot assign to field "addressid" of column "address" because its type addresstype[] is not a composite type
SQL state: 42804
这是我尝试的查询:
INSERT INTO Customer (CustomerID,Person.PersonID,Person.Title,Person.FirstName,Person.LastName,Person.Address.AddressID,Person.Address.AddressLine1,Person.Address.AddressLine2,Person.Address.City,Person.Address.PostalCode)
SELECT TCustomer.CustomerID,TPerson.PersonID,TPerson.Title,TPerson.FirstName,TPerson.LastName,TAddress.AddressID,TAddress.AddressLine1,TAddress.AddressLine2,TAddress.City,TAddress.PostalCode
FROM TCustomer,TPerson,TPersonAddress,TAddress
WHERE TCustomer.PersonID = TPerson.PersonID
AND TPerson.PersonID = TPersonAddress.PersonID
AND TPersonAddress.AddressID = TAddress.AddressID;
表格和类型:
CREATE TYPE AddressType AS(
AddressID integer,
AddressLine1 text,
AddressLine2 text,
City text,
PostalCode text);
CREATE TYPE PersonType AS(
PersonID integer,
Title text,
FirstName text,
LastName text,
Address AddressType[]);
CREATE TABLE Customer(
CustomerID integer,
Person PersonType,
PRIMARY KEY(CustomerID));
CREATE TEMPORARY TABLE TAddress (AddressID integer,AddressLine1 text,AddressLine2 text,City text,PostalCode text);
CREATE TEMPORARY TABLE TPerson (PersonID integer,Title text,FirstName text,LastName text);
CREATE TEMPORARY TABLE TCustomer (CustomerID integer,PersonID integer);
CREATE TEMPORARY TABLE TPersonAddress (PersonID integer,AddressID integer);
临时表已从 CSV 文件复制数据。 问题是每个人可以有许多不同的地址。 所以我必须将所有地址加载到 AddressType 数组中。 但现在这似乎是不可能的,我找不到处理数组的方法。
我在互联网上找到的所有处理数组的方法是:
INSERT INTO aa VALUES (3, ARRAY[ARRAY[1,2],ARRAY[3,4]]);
INSERT INTO sal_emp
VALUES ('Bill',
'{10000, 10000, 10000, 10000}',
'{{"meeting", "lunch"}, {"training", "presentation"}}');
这样,但这些示例只是添加了对我的情况完全没有帮助的指定值。那么如何让它从以下位置复制值: TAddress.AddressID,TAddress.AddressLine1,TAddress.AddressLine2,TAddress.City,TAddress.PostalCode
到数组:
Person.Address.AddressID,Person.Address.AddressLine1,Person.Address.AddressLine2,Person.Address.City,Person.Address.PostalCode
如果是同一个人,则必须将所有地址添加到同一个数组中。
【问题讨论】:
-
您可以随意改进表格布局吗?因为我要推荐database normalization。
-
是的,我会考虑任何建议。尽管请注意,重点是使关系数据库成为对象关系数据库。所以我不想拆分表太多以至于我最终得到相同的关系数据库模式。我知道对象关系数据库很糟糕,但你能做什么,我需要这样做。(临时表是什么关系数据库表看起来像我猜你可以找出 pkeys/fkeys)
-
我想至少跳过表 PersonAddress,包括类型/数组等,因此它与关系数据库有所不同。
-
你提供的链接主要讲的是关系模型。
-
我不同意,复合类型的数组是合理且有用的选择,因为行只是向量集。
标签: arrays postgresql database-design insert object-relational-model