几次我一直在回归对数据库关系理论的理解,但我还是没有成功。我会再试一次。
我们说我有两张桌子: 动物:
CREATE TABLE animals (id INTEGER PRIMARY KEY, name TEXT);
和食物:
CREATE TABLE food (id INTEGER PRIMARY KEY, food TEXT);
我需要的是将这两个表连接起来。例如,我想选择“猪”。来自动物表,并从食物表中了解猪可以吃的所有东西。 我只是不知道如何联系它们。我相信我可以在 food 表中添加一个外键,它会链接到 animal 表的主键,但有一个问题我无法弄清楚:
如果我从例如网页表单输入数据库,我输入它所吃的动物名称和产品,该怎么办?动物名称转到第一个表并自动收到一个id。它只是自动增量。所以,为了使它成为第二个表的关系,我必须从第一个表中选择新的ID!所以我们得到了三个sql请求:
1)INSERT INTO animals (name) VALUES ('pig);
2)SELECT id FROM animals WHERE name='pig';
(我们将它存储在一个变量中,现在并不重要)
3)INSERT INTO food (product, animal_id) VALUES ('something', 'id of a pig');
我觉得这是错的。 或者我的思绪无法理解这种复杂的抽象。
请建议。
答案 0 :(得分:3)
您需要一个与Animals
和Food
相关的联结表。这看起来像是:
CREATE TABLE AnimalFoods (
id INTEGER PRIMARY KEY,
AnimalId int references Animal(id),
FoodId int references Food(id)
);
然后,您可以使用这些表格中的各种联接来回答您的问题。
答案 1 :(得分:1)
动物可以多吃多种食物吗?如果没有,那么您可以将[rbp-4]
作为食物表animal
上的主键。如果food
可以包含多种食物,那么您可以在animal
表中拥有自动增量ID(就像animal
表中的那个)。正如jWeaver指出的那样,在food
表中有一个parentID作为引用food
表的外键。
答案 2 :(得分:1)
这就是你实现这种多对多关系的方式:
您可以使用data-modifying CTE完成 单 查询所描述的任务:
WITH ins AS (
INSERT INTO animals (name) VALUES ('pig')
RETURNING animal_id -- return generated ID immediately
)
INSERT INTO animal_food (food_id, animal_id) -- m:m link table
SELECT food_id, animal_id -- food_id passed as 2nd param
FROM ins;
假设我们使用已知的食物进行操作(就像从下拉菜单中选择一样。此外,您还需要再多一步来查找食物,或者可能需要INSERT
一行:
...仍然是一个查询。
链接的答案提供了对并发交易中竞争条件更棘手问题的一些见解。
答案 3 :(得分:0)
使用animal
创建parentId
表格,然后在food
表格中使用该parentId
列进行参考。
示例:强>
Animal(ParentId integer, NAME TEXT);
和
Food(FoodId integer, ParentId integer, Name Text);
就是这样。确保您在ParentId
表中使用相同的food
来查找特定动物的食物。
希望,这对你有意义。
答案 4 :(得分:0)
如果不同的动物吃同一种食物,你应该用外键定义一个表,这个表是两个相关表的id:
CREATE TABLE animals (id INTEGER PRIMARY KEY, name TEXT);
CREATE TABLE food (id INTEGER PRIMARY KEY, food TEXT);
CREATE TABLE eat (animal_id INTEGER, food_id INTEGER,
FOREIGN KEY (animal_id) REFERENCES animals(id),
FOREIGN KEY (food_id) REFERENCES food(id));
答案 5 :(得分:0)
假设动物会吃多种食物,多只动物可以吃同样的食物。你需要与动物和食物建立多对多的联系。
Animal(id integer, name Text)
Food(id integer, name TEXT)
AnimalFood(animalId integer,foodId integer)
CREATE TABLE animals (id int(11) not null auto_increment primary key, name text);
CREATE TABLE foods (id int(11) not null auto_increment primary key, name text);
CREATE TABLE animal_foods (animal_id int(11) not null, food_id (11) not null);