创建“加入”表 - sqlite3

时间:2018-01-16 19:48:28

标签: join sqlite

我认为我对此非常接近,但无法点击它。

我已经设置了两个简单的表格。

表A:

CREATE TABLE customer(
id INTEGER PRIMARY KEY,
first_name TEXT,
last_name TEXT,
email TEXT UNIQUE NOT NULL,
password TEXT NOT NULL,
create_time TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP
);

我在表A中正确填充了两行数据。

表B:

CREATE TABLE address(
   ...> id INTEGER PRIMARY KEY,
   ...> street_address_1 TEXT NOT NULL,
   ...> street_address_2 TEXT,
   ...> street_address_3 TEXT,
   ...> city TEXT NOT NULL,
   ...> state TEXT NOT NULL,
   ...> zip TEXT NOT NULL);

我已成功将CSV文件导入该表格。

我正在尝试使用外键创建一个将表A连接到表B的第3个表。

我可以使用下面的代码创建表,但是当我尝试选择表时,我得到一个空白,这意味着我显然做错了。我希望看到两个表在相互ID号上重叠的数据,即来自customer = Id的ID来自地址我希望看到这些行的数据来自表C。

表C(联接表):

CREATE TABLE customer_address(
id INTEGER PRIMARY KEY,
customer_id INTEGER,
address_id INTEGER,
first_name TEXT NOT NULL,
last_name TEXT NOT NULL,
email TEXT NOT NULL,
password TEXT NOT NULL,
street_address_1 TEXT NOT NULL,
street_address_2 TEXT,
street_address_3 TEXT,
city TEXT NOT NULL,
state TEXT NOT NULL,
zip TEXT NOT NULL,
FOREIGN KEY (customer_id) REFERENCES customer(id),
FOREIGN KEY (address_id) REFERENCES address(id)
);

谢谢!

我使用以下方法将数据导入地址表:

sqlite> .mode csv
sqlite> .import address.csv address

我使用以下方法手动输入数据到第一个表:

insert into customer(first_name, last_name, email, password)
values('Ad','Mac','a.Mac@gmail.com','Mab'),('Brian','Obrien','bob@example.com','123456');

1 个答案:

答案 0 :(得分:1)

不要复制连接表中的数据(通常称为桥接表)。这应该适用于表C:

CREATE TABLE customer_address(
id INTEGER PRIMARY KEY,
customer_id INTEGER,
address_id INTEGER,
FOREIGN KEY (customer_id) REFERENCES customer(id),
FOREIGN KEY (address_id) REFERENCES address(id));

复制列是不好的做法,因为它1)违背了使用关系模型的目的; 2)如果在一个表中更新或删除信息而不是另一个表中的信息,则可能导致冲突记录。

此外,您不应该在同一张桌子中拥有street_address_1,street_address_2,street_address_3。这违反了First Normal Form。可以这样想,一个人可以有三个以上的地址吗?他们可以在不同的城市有两个地址吗?这三个地址都有相同的拉链吗?