Как я могу вставить в таблицы с отношениями? - PullRequest
1 голос
/ 27 мая 2009

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

Вот мой дизайн базы данных: alt text

  1. Kunde = Клиент
  2. Vare = Продукт
  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 для каждой записи)

Ответы [ 5 ]

4 голосов
/ 27 мая 2009

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

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

3 голосов
/ 27 мая 2009

Попробуйте это ...

сначала нужно вставить клиента

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

1 голос
/ 27 мая 2009

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

Здесь транзакции становятся важными.

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

0 голосов
/ 27 мая 2009

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

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

0 голосов
/ 27 мая 2009

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

...