【问题标题】:How can I insert into tables with relations?如何插入具有关系的表中?
【发布时间】:2010-10-29 07:26:11
【问题描述】:

我只做过没有关系的数据库,但现在我需要做一些更严肃更正确的事情。

这是我的数据库设计:

  1. 昆德 = 客户
  2. Vare = 产品
  3. Ordre = 订单(阅读:我要下订单)
  4. VareGruppe = ehm..type? (阅读:汽车、椅子、壁橱等)
  5. VareOrdre = Product_Orders

这是我的 SQL (SQLite) 架构:

CREATE TABLE Post (
    Postnr INTEGER NOT NULL PRIMARY KEY,
    Bynavn VARCHAR(50) NOT NULL
);

CREATE TABLE Kunde (
    CPR INTEGER NOT NULL PRIMARY KEY,
    Navn VARCHAR(50) NOT NULL,
    Tlf INTEGER NOT NULL,
    Adresse VARCHAR(50) NOT NULL,
    Postnr INTEGER NOT NULL 
    CONSTRAINT fk_postnr_post REFERENCES Post(Postnr)
);

CREATE TABLE Varegruppe (
    VGnr INTEGER PRIMARY KEY,
    Typenavn VARCHAR(50) NOT NULL
);


CREATE TABLE Vare (
    Vnr INTEGER PRIMARY KEY,
    Navn VARCHAR(50) NOT NULL,
    Pris DEC NOT NULL,
    Beholdning INTEGER NOT NULL,
    VGnr INTEGER NOT NULL
        CONSTRAINT fk_varegruppevgnr_vgnr REFERENCES Varegruppe(VGnr)
);

CREATE TABLE Ordre (
    Onr INTEGER PRIMARY KEY,
    CPR INTEGER NOT NULL
        CONSTRAINT fk_kundecpr_cpr REFERENCES Kunde(CPR),
    Dato DATETIME NOT NULL,
    SamletPris DEC NOT NULL
);

CREATE TABLE VareOrdre (
    VareOrdreID INTEGER PRIMARY KEY,
    Onr INTEGER NOT NULL
        CONSTRAINT fk_ordrenr_onr REFERENCES Ordre(Onr),
    Vnr INTEGER NOT NULL 
        CONSTRAINT fk_varevnr_vnr REFERENCES Vare(Vnr),
    Antal INTEGER NOT NULL
);

它应该可以正常工作。

但我对Product_Orders感到困惑。

如何创建订单?例如,2 个产品使用SQL INSERT INTO? 我什么也做不了。

到目前为止:

仅当我手动将产品和数据插入Product_Orders,然后将该数据添加到Orders = 以使其完成时。或者反过来(使用 1 个 SQL 创建一个订单,然后为每个条目手动将产品插入 Product_orders - 1 SQL)

【问题讨论】:

  • 您是否考虑过研究第三方数据库工具?我不确定您使用的是什么语言,但 .NET 使用 LINQ,Java 使用 Hibernate / OpenJPA / 许多其他语言。许多程序员正在放弃编写 SQL 来支持操作对象。
  • 是的,我真的很喜欢 LINQ-TO-SQL。可悲的是,我在一个团队中工作,他们只对 SQL 感到满意——我似乎无法让他们学习数据库方面的新工具

标签: sql foreign-keys primary-key entity-relationship


【解决方案1】:

试试这个...

首先你必须插入一个客户

insert into kunde values(1, 'navn', 1, 'adresse', 1)

然后你插入一个类型

insert into VareGruppe values(1, 'Type1')

然后你插入一个产品

insert into vare values(1, 'product1', '10.0', 1, 1)

然后你添加一个订单

insert into ordre values(1, 1, '20090101', '10.0')

然后你在 product_orders 表中插入一个寄存器

insert into VareOrdre values (1, 1, 1, 1)

我想就是这样。 :-)

由于主键是自增的,所以不要将它们添加到插入中并像这样指定列

insert into vare(Nav, Pris, Beholdning, VGnr) values('product1', '10.0', 1, 1)

使用Select @@identity查看onr值

【讨论】:

  • 抱歉,大部分主键都是自增的:)
  • 是的,我知道 :) 但问题是:当您创建一个订单时,您如何知道在将产品插入 VareOrdre 时的 Onr?
【解决方案2】:

您应该首先创建一个订单,然后在表 Product_Orders 中插入产品。这是必要的,因为您需要一个带有 id 的实际订单才能将其与表 Product_Orders 相关联。

您始终应该先在外键表中创建一条记录,然后才能在当前表中创建一条记录。这样,您应该创建一个“帖子”、客户、类型、产品、订单和 product_order。

【讨论】:

  • 好的,我创建一个订单。创建后如何知道刚刚创建的订单的Onr?插入 2 个产品时我需要 Onr。
  • 你能显示3个sql语句吗? INSERT INTO Order INSERT INTO Product_Orders INSERT INTO Product_Orders 或完成任务所需的任何内容。
  • 如果Onr是自增字段,可以用(select top 1 onr from Ordre order by onr)搜索。然后您可以使用结果将其插入到 Product_Orders 表中。您使用的是什么 DBMS?
  • 我在 Visual Studio 中使用 SQLite :) - system.data 之一。是的,我想我必须这样做,它似乎不是很安全。幸运的是,我的应用程序是每个应用程序 1 个 DB,但我可以想象一个出错的场景 - 如果它是使用 1 个 DB 的多个应用程序
  • 哦,是的,它是一个 auto_increment 字段
【解决方案3】:

以防万一这是 MySQL:如果您使用 MyISAM,MySQL 服务器会完全忽略外键。如果您希望在数据库端实际执行任何类型的完整性,而不仅仅是在您的逻辑中,则必须将引擎设置为 InnoDB。这不是您的问题,但需要注意。

fbinder 的问题是对的 :)

【讨论】:

    【解决方案4】:

    是导致问题的销售价格(我猜这就是 SamletPris 的意思)吗?我可以看到这是一个问题。一种常见的设计解决方案是有 2 个表:Order 和 OrderLine。 Order 是一个标题表——它将与 Customer 表以及任何其他“顶级”数据具有外键关系。 OrderLine 表与 Order 表和 Product 表具有 FK 关系,以及数量、单价等对于订单行项目是唯一的。现在,要获取订单的销售价格,您需要对该订单的 OrderLine 表的(单价 * 数量)求和。存储整个订单的 SalesPrice 可能会导致严重的问题。

    【讨论】:

      【解决方案5】:

      我认为您已经掌握了需要发生的事情。但我认为您要了解的是如何确保数据完整性。

      这就是交易变得重要的地方。

      http://www.sqlteam.com/article/introduction-to-transactions

      【讨论】:

        猜你喜欢
        • 2021-12-21
        • 2013-11-11
        • 2021-09-07
        • 2018-10-09
        • 2020-08-30
        • 1970-01-01
        • 2016-10-20
        • 1970-01-01
        相关资源
        最近更新 更多