2009-05-27 6 views
1

Я только делал базы данных без отношений, но теперь мне нужно сделать что-то более серьезное и правильное.Как я могу вставить в таблицы с отношениями?

Вот мой дизайн базы данных: alt text http://i41.tinypic.com/27xqzxl.jpg

  1. Kunde = Клиент
  2. Варе = Продукт
  3. Ordre = Order (Read: Я хочу сделать заказ)
  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 для каждой записи)

+0

Рассматривались ли вы в инструментах сторонних БД? Я не уверен, какой язык вы используете, но .NET использует LINQ, Java использует Hibernate/OpenJPA/многие другие. Многие программисты уходят от написания SQL в пользу манипулирования объектами. – Kieveli

+0

Да, у меня есть Я очень люблю LINQ-TO-SQL. К сожалению, я работаю в команде, и они только хорошо питаются вокруг SQL - я не могу заставить их изучать новый инструмент, когда дело доходит до баз данных. – CasperT

ответ

4

Вы должны сначала создать заказ, а затем вставить продукты в таблице Product_Orders. Это необходимо, потому что вам нужен фактический заказ с идентификатором, чтобы связать его с таблицей Product_Orders.

Вы всегда должны создать запись в таблице внешних ключей, прежде чем сможете создать ее в своей текущей таблице. Таким образом, вы должны создать «Post», клиент, тип, продукт, заказ и product_order.

+0

Итак, я создаю заказ. Создав его, как я узнаю Onr только что созданного Ордера? Мне нужно Onr при вставке 2 продуктов. – CasperT

+0

Не могли бы вы показать 3 sql предложения? INSERT INTO Заказать INSERT INTO Product_Orders INSERT INTO Product_Orders или то, что требуется, чтобы сделать задачу. – CasperT

+0

Если Onr - это поле с автоматическим приращением, вы можете его искать (выберите top 1 onr из Ordre order by onr). Затем вы можете использовать результат, чтобы вставить его в таблицу Product_Orders. Какие СУБД вы используете? – fbinder

1

Я думаю, что вы уже знаете, что должно произойти. Но я думаю, что вы пытаетесь понять, как обеспечить целостность данных.

В этом случае транзакции становятся важными.

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

0

Является ли это SalesPrice (я полагаю, это то, что означает SamletPris), что вызывает проблему? Я вижу, что это проблема. Одно из стандартных решений состоит в том, чтобы иметь 2 таблицы: Order and OrderLine. Заказ представляет собой таблицу заголовков - он будет иметь отношение внешнего ключа к таблице Customer и любые другие данные верхнего уровня. Таблица OrderLine имеет отношения FK к таблице Order и таблице Product, а также количество, цена за единицу и т. Д., Которые являются уникальными для позиции заказа. Теперь, чтобы получить цену продажи для заказа, вы суммируете (стоимость единицы товара *) таблицы OrderLine для этого заказа. Сохранение SalesPrice для целого порядка, вероятно, вызовет большие проблемы.

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, чтобы увидеть значение ОНР

+0

К сожалению, большинство основных ключей являются автоинкрементами :) – CasperT

+0

Да, я знаю :) Но проблема в том, что когда вы создаете ordre, как вы знаете Onr при вставке продуктов в VareOrdre? – CasperT

0

записки, только в case this is MySQL: если вы используете MyISAM, сервер MySQL полностью игнорирует внешние ключи. Вы должны установить движок InnoDB, если вы хотите, чтобы какая-либо целостность фактически выполнялась на стороне базы данных, а не только в вашей логике. Это не ваш вопрос, но это то, о чем нужно знать.

fbinder получил вопрос правильно :)