问题描述
我将地址信息存储在多个表中:国家/地区、邮政编码、街道和电话号码。
CREATE TABLE country (
country_id INT,name VARCHAR(45),PRIMARY KEY(country_id));
CREATE TABLE zip (
zip_id INT,zip VARCHAR(45),PRIMARY KEY(zip_id));
CREATE TABLE street (
street_id INT,PRIMARY KEY(street_id));
CREATE TABLE number (
number_id INT,number INT,PRIMARY KEY(number_id));
我使用包含前面提到的表的 ID 作为外键的地址表将这些信息放在一起。
CREATE TABLE address (
address_id INT,country_id INT,zip_id INT,street_id INT,number_id INT,PRIMARY KEY(address_id),FOREIGN KEY(country_id) REFERENCES country(country_id),FOREIGN KEY(zip_id) REFERENCES zip(zip_id),FOREIGN KEY(street_id) REFERENCES street(street_id),FOREIGN KEY(number_id) REFERENCES number(number_id));
解决方法
正如评论中首先提到的,您需要将其他表中的 id 添加到地址表中。在上面的 sql 中,您设置了与外键的关系,但地址表没有任何可将其映射到的字段。您应该像这样创建地址表:
CREATE TABLE address (
address_id INT,country_id INT,zip_id INT,street_id INT,number_id INT,PRIMARY KEY(address_id),FOREIGN KEY(country_id) REFERENCES country(country_id),FOREIGN KEY(zip_id) REFERENCES zip(zip_id),FOREIGN KEY(street_id) REFERENCES street(street_id),FOREIGN KEY(number_id) REFERENCES number(number_id));
然后你可以像这样加入:
SELECT a.address_id,c.name,s.name,n.number,z.zip
FROM address a
JOIN country c ON c.country_id = a.country_id
JOIN street s ON s.street_id = a.street_id
JOIN number n ON n.number_id = a.number_id
JOIN zip z ON z.zip_id = a.zip_id
但是为数字(如果您指的是街道号码?)和 zip 制作表格可能不是最好的主意。通常,您需要一个国家/地区表,但为每个 zip 设置一个表,而不是将它们直接添加到地址表中似乎是错误的。但我没有所有信息,所以你可能有充分的理由。