我认为我对此非常接近,但无法点击它。
我已经设置了两个简单的表格。
表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');
答案 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。可以这样想,一个人可以有三个以上的地址吗?他们可以在不同的城市有两个地址吗?这三个地址都有相同的拉链吗?