Wie kann ich das einfügen in Tabellen mit Beziehungen?
Habe ich nur getan Datenbanken ohne Beziehungen, aber jetzt muss ich etwas tun, mehr ernst und korrekt.
Hier ist mein Datenbank-design:
- Kunde = Kunde
- Vare = Produkt
- Ordre = Um (Lesen: ich will eine Bestellung machen)
- VareGruppe = ehm..geben? (Lesen: Auto, Stuhl, Schrank etc).
- VareOrdre = Product_Orders
Hier ist mein SQL (SQLite) - schema:
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
);
Sollte es korrekt funktionieren.
Aber ich bin verwirrt über Product_Orders
.
Wie erstelle ich eine Bestellung? Zum Beispiel 2 Produkte mit SQL INSERT INTO
?
Ich kann nichts arbeiten.
Bisher:
Nur, wenn ich manuell einfügen, Produkte und Daten in Product_Orders
und fügen Sie dann die Daten an Orders =
die macht es zu vollenden. Oder anders herum (erstellen Sie eine Bestellung mit 1 SQL, dann ein manuelles einlegen der Produkte in Product_orders - 1
SQL für jeden Eintrag)
- Haben Sie als auf der Suche in 3rd-party-DB-tools? Ich bin mir nicht sicher, welche Sprache Sie verwenden, aber .NET verwendet LINQ, Java verwendet Hibernate / OpenJPA / viele, viele andere. Eine Menge Programmierer sind Weg aus dem schreiben von SQL-zugunsten der Manipulation von Objekten.
- Ja, ich habe, ich Liebe LINQ-TO-SQL-wirklich. Leider, ich arbeite in einem team, und Sie ernähren sich nur bequem rund um SQL - ich kann nicht scheinen, zu machen, dass Sie lernen, ein neues tool, wenn es um Datenbanken
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie zunächst einen Auftrag anlegen und dann legen Sie die Produkte in der Tabelle Product_Orders. Dies ist notwendig, da benötigen Sie einen aktuellen Auftrag mit einer id zu verknüpfen mit der Tabelle Product_Orders.
Sollten Sie immer erstellen Sie einen Datensatz in der foreign-key-Tabelle, bevor Sie in der Lage eines zu erstellen in Ihrer aktuellen Tabelle. So erstellen Sie eine "Post" -, Kunden -, Typ -, Produkt -, Auftrags-und product_order.
Versuchen, diese ...
zuerst müssen Sie zum einfügen eines Kunden
legen Sie dann eine Art
legen Sie dann ein Produkt
dann fügen Sie ein, um
dann fügen Sie ein register, um die product_orders Tabelle
Ich denke, das ist es. 🙂
Als die Primärschlüssel sind autoincrement, nicht fügen Sie Sie auf einfügen und geben die Spalten an, wie diese
Verwenden
Select @@identity
zu sehen, die onr WertIch denke, Sie haben bereits den hängen von dem, was geschehen muss. Aber was ich denke, Sie sind immer an ist, wie, um die Datenintegrität sicherzustellen.
Dies ist, wo Transaktionen werden immer wichtiger.
http://www.sqlteam.com/article/introduction-to-transactions
Ist es die SalesPrice (ich vermute, das ist, was SamletPris bedeutet) das Problem verursacht? Ich kann sehen, dass hier ein problem. Eine gemeinsame design-Lösung um 2 Tabellen: Auftrag und OrderLine. Die Bestellung ist ein header, der Tabelle - es wird über die foreign-key-Beziehung zu der Tabelle "Kunde", und andere "top-level" Daten. Der OrderLine-Tabelle hat FK Beziehungen zu der Order-Tabelle und der Product-Tabelle, zusammen mit der Menge, Einheit, Preis, etc. das sind eindeutig für ein, um die werbebuchung. Nun, um den Verkaufspreis für eine Bestellung, die Sie der Summe (Einzelpreis * Menge) der OrderLine-Tabelle für die Bestellung. Die Speicherung der SalesPrice für eine gesamte Bestellung wird wahrscheinlich dazu führen, dass große Probleme auf der ganzen Linie.
Einen Hinweis nur in diesem Fall wird MySQL: Wenn Sie MyISAM, MySQL-server ignoriert die Fremdschlüssel vollständig. Sie haben um die engine InnoDB, wenn Sie jede Art von Integrität auch wirklich durchgesetzt werden auf der Datenbank Ende, anstatt nur in Ihrer Logik. Dies ist nicht Ihre Frage, aber es ist etwas bewusst zu sein.
fbinder habe die Frage gerade 🙂