表和

时间:2015-07-20 10:58:55

标签: sql postgresql

几次我一直在回归对数据库关系理论的理解,但我还是没有成功。我会再试一次。

我们说我有两张桌子: 动物:

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');

我觉得这是错的。 或者我的思绪无法理解这种复杂的抽象。

请建议。

6 个答案:

答案 0 :(得分:3)

您需要一个与AnimalsFood相关的联结表。这看起来像是:

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);