如何将三列作为主键

时间:2013-03-29 15:59:01

标签: mysql sql

我试图学习如何将两个文件匹配在一起。但我现在正在尝试每个小时5个小时......但仍然不知道该怎么做。

第一个文件(600.000行)包含4列:

Postal, Number, Houseletter, livingspace

第二个文件(7.000行)包含4列:

Postal, Number, Houseletter, Furniturevalue

在我的第一个文件中,我拥有来自大区域的所有生活空间,在我的第二个文件中,我在这个大区域内有几个地址的Furniturevalue。

我想在第二个文件中添加来自文件1的生活空间中的地址。

所以我在数据库中导入了这些文件。

Table first file -> Space
Table second file -> Furniture

现在我正在尝试为表创建主键:

Primary key --> Postal, Number, Houseletter

但这不起作用,因为列只在Postal + Number + Houseletter时是唯一的,但彼此不相同。

有谁知道下一步?我该怎么做才能使这个查询工作:

SELECT postal, number, houseletter, furniturevalue, livingspace
FROM space, furniture
WHERE ( space.postal = furniture.postal
AND     space.number = furniture.number
AND     space.houseletter = furniture.houseletter)

我试图用这个查询创建一个带有`postal,number,houseletter,furniturevalue,livingspace'的新视图 所以来自两个表的数据。 但首先我需要用主键解决我的问题。

感谢您的帮助!

ps:我在phpmyadmin中使用sql

4 个答案:

答案 0 :(得分:8)

ALTER TABLE space ADD PRIMARY KEY(Postal, Number, Houseletter);

如果主键已存在,那么您希望这样做:

ALTER TABLE space DROP PRIMARY KEY, ADD PRIMARY KEY(Postal, Number, Houseletter);

如果你有重复的PK,你可以试试这个:

ALTER IGNORE TABLE space ADD UNIQUE INDEX idx_name (Postal, Number, Houseletter );

这将删除所有重复的行。作为一个额外的好处,未来的重复INSERT将会出错。与往常一样,您可能希望在运行此类

之前进行备份

第二个问题,您的查询应如下所示:

SELECT postal, number, houseletter, furniturevalue, livingspace
FROM space INNER JOIN furniture
ON ( space.postal = furniture.postal
AND     space.number = furniture.number
AND     space.houseletter = furniture.houseletter)

答案 1 :(得分:0)

ALTER TABLE <TableName>
ADD CONSTRAINT <constraintName> PRIMARY KEY (colA, colB, ..., colN)

答案 2 :(得分:0)

您可以使用group by为每个(postal, number, houseletter)组合创建一个唯一的行。聚合计算该组的livingspace值。此示例选择livingspace聚合的最高max()

select  coalesce(space.postal, furniture.postal) as postal
,       coalesce(space.number, furniture.number) as number
,       coalesce(space.houseletter, furniture.houseletter) as houseletter
,       max(furniture.furniturevalue) as furniturevalue
,       max(space.livingspace) as livingspace
from    space
full outer join
        furniture
on      space.postal = furniture.postal
        and space.number = furniture.number
        and space.houseletter = furniture.houseletter
group by
        coalesce(space.postal, furniture.postal)
,       coalesce(space.number, furniture.number)
,       coalesce(space.houseletter, furniture.houseletter)

答案 3 :(得分:0)

这样的事可能有用。您可以使用concat()将列组合在一起。

select (concat(s.Postal,' ',s.Number,' ',s.Houseletter)) as s.address,(concat(f.Postal,' ',f.Number,' ',f.Houseletter)) as f.address,s.*,f.* from space s,furniture f where s.address=f.address;