如何插入带有关系的表?

时间:2009-05-27 14:56:31

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

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

这是我的数据库设计: alt text

  1. Kunde =客户
  2. Vare =产品
  3. Ordre =订单(阅读:我想订购)
  4. VareGruppe = ehm..type? (阅读:汽车,椅子,壁橱等)
  5. VareOrdre = Product_Orders
  6. 这是我的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)

5 个答案:

答案 0 :(得分:4)

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

您始终应该在外键表中创建记录,然后才能在当前表中创建记录。这样你就可以创建一个“发布”,客户,类型,产品,订单和product_order。

答案 1 :(得分:3)

试试这个......

首先你必须插入一个客户

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值

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

fbinder得到了正确的问题:)