2

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

这是我的数据库设计: 替代文字

  1. 昆德=客户
  2. 变量 = 产品
  3. Ordre = Order(阅读:我要下订单)
  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)

4

5 回答 5

6

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

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

于 2009-05-27T15:01:50.013 回答
4

试试这个 ...

首先你必须插入一个客户

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值

于 2009-05-27T15:11:17.780 回答
1

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

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

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

于 2009-05-27T15:01:04.600 回答
0

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

于 2009-05-27T15:08:33.290 回答
0

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

fbinder 得到了正确的问题:)

于 2009-05-27T15:11:47.623 回答