2009-05-27 63 views
1

我只做了沒有關係的數據庫,但現在我需要做更嚴肅和正確的事情。如何插入關係表中?

這裏是我的數據庫設計: alt text http://i41.tinypic.com/27xqzxl.jpg

  1. 昆德=客戶
  2. 瓦爾=產品
  3. 勳章=訂單(:我想打一個數量級)
  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創建訂單,然後手動將產品插入到每個條目的SQL查詢中)

+0

您是否考慮過查看第三方數據庫工具?我不確定你使用的是什麼語言,但.NET使用LINQ,Java使用Hibernate/OpenJPA /許多其他語言。很多程序員正在從編寫SQL開始轉向使用對象。 – Kieveli 2009-05-27 15:05:54

+0

是的,我有 我真的很喜歡LINQ-TO-SQL。 不幸的是,我在一個團隊中工作,他們只是圍繞SQL提供舒適的服務 - 我不能讓他們學習一個新的工具,當涉及到數據庫 – CasperT 2009-05-27 15:08:15

回答

4

,必須先創建一個訂單,然後插入產品的表格Product_Orders。這是必要的,因爲您需要帶有ID的實際訂單才能將其與表Product_Orders關聯。

您始終應該在外鍵表中創建一條記錄,然後才能在當前表中創建一條記錄。這樣你應該創建一個「發佈」,客戶,類型,產品,訂單和product_order。

+0

好吧,所以我創建了一個訂單。 創建它之後,我如何知道剛剛創建的訂單的Onr? 插入2個產品時需要Onr。 – CasperT 2009-05-27 15:44:16

0

是否是SalesPrice(我猜這就是SamletPris的含義)導致了這個問題?我可以看到這是一個問題。一種常見的設計解決方案是有2個表格:Order和OrderLine。訂單是一個標題表 - 它將與客戶表以及其他任何「頂級」數據具有外鍵關係。訂單行表格與訂單表格和產品表格具有FK關係,以及訂單行項目所特有的數量,單位價格等。現在,爲了獲得訂單的銷售價格,您將該訂單的OrderLine表格的(單位價格*數量)相加。整個訂單存儲銷售價格可能會導致大問題。

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值

0

的說明只是這是MySQL的情況:如果你使用MyISAM,MySQL服務器會完全忽略外鍵。如果您希望在數據庫端實際實施任何種類的完整性,而不僅僅是在邏輯中執行,則必須將引擎設置爲InnoDB。這不是你的問題,但它是要注意的事情。

fbinder得到了正確的問題:)