2014-01-09 3 views
0

Я новичок в SQL и хочу создать связь между двумя таблицами One-To-Many. У меня есть эти две таблицы, созданные с помощью следующих запросов:SQL One-to-Many Отношения

CREATE TABLE Customers 
(
    CustomerId INT NOT NULL AUTO_INCREMENT, 
    FirstName VARCHAR(255) NOT NULL, 
    LastName VARCHAR(255) NOT NULL, 
    Email VARCHAR(255) NOT NULL, 
    Address VARCHAR(255) NOT NULL, 
    PRIMARY KEY(CustomerId) 
); 

CREATE TABLE Orders 
(
    OrderId INT NOT NULL AUTO_INCREMENT, 
    Date DATE NOT NULL, 
    Quantity INT NOT NULL, 
    TotalDue FLOAT NOT NULL, 
    CustomerId INT NOT NULL, 
    PRIMARY KEY(OrderId), 
    FOREIGN KEY(CustomerId) REFERENCES Customers(CustomerId) 
); 

Однако, даже если я поставил CustomerId в качестве внешнего ключа для таблицы Orders я все еще в состоянии добавить строки в таблицу Orders с CustomerId, который нет в таблице Customers. Почему это и как я могу создать реальную связь между таблицами?

Это то, что таблицы похожи (копировать/вставить из моего клиента mysql):

mysql> select * from Customers; 
+------------+-----------+----------+-------------------+------------------------+ 
| CustomerId | FirstName | LastName | Email    | Address    | 
+------------+-----------+----------+-------------------+------------------------+ 
|   1 | Jacks  | James | [email protected] | Str. Moony, No. 9  | 
|   2 | Mock  | Grad  | [email protected] | Str. Mars, No. 91  | 
|   3 | James  | Geremy | [email protected]  | Str. Monday, No. 12 | 
|   4 | Joana  | Joan  | [email protected] | Str. Comete, No. 19 | 
|   5 | Granicer | James | [email protected] | Str. Sydney, No. 651 | 
+------------+-----------+----------+-------------------+------------------------+ 
5 rows in set (0.00 sec) 

mysql> select * from Orders; 
+---------+------------+----------+----------+------------+ 
| OrderId | Date  | Quantity | TotalDue | CustomerId | 
+---------+------------+----------+----------+------------+ 
|  1 | 2014-01-09 |  10 |  340 |   3 | 
|  2 | 2014-01-09 |  1 |  50 |   3 | 
|  3 | 2014-01-09 |  11 |  55 |   5 | 
|  4 | 2014-01-09 |  11 |  55 |   51 | 
+---------+------------+----------+----------+------------+ 
4 rows in set (0.00 sec) 

Как вы можете видеть OrderId 4 содержит клиент с CustomerId 51, которая не находится в Customers таблице.

+0

Вы используете INNODB двигатель для таблиц? – raj

+0

@raj Я не знаю, я довольно новичок в базах данных ... как я могу узнать? –

+0

«показать статус таблицы» должен предоставить вам типы двигателей – raj

ответ

0

я сдался и начал использовать веб-клиент в MySQL ...

0

Вы должны установить механизм хранения ... изменить свой запрос ...

CREATE TABLE Orders 
(
    OrderId INT NOT NULL AUTO_INCREMENT, 
    Date DATE NOT NULL, 
    Quantity INT NOT NULL, 
    TotalDue FLOAT NOT NULL, 
    CustomerId INT NOT NULL, 
    PRIMARY KEY(OrderId), 
    FOREIGN KEY(CustomerId) REFERENCES Customers(CustomerId) 
)ENGINE=INNODB; 
+0

большое спасибо за ответ! да, там есть ошибка, но я воссоздал пример с исправленной ошибкой, и я не думаю, что это так. Я все еще могу это сделать ... вот мой вывод клиента mysql: http://pastebin.com/naNP0RMq –

+0

Я отредактирую свой ответ – Leo

+0

спасибо! :) Я сразу же попробую! –

0

Используйте InnoDB для таблицы двигателя.

ALTER TABLE table_name ENGINE=InnoDB; 
+0

Я попытался использовать 'ALTER TABLE имя_таблицы ENGINE = InnoDB;', но он по-прежнему позволяет мне добавить недопустимый 'CustomerId' ... вот что я сделал http://pastebin.com/5mXmCwHM, и в конце концов я могу добавить клиента с id 9, когда у меня только 5 клиентов в таблице «Customers» ... я сделал что-то неправильно или изменение таблицы не будет работать? –

+0

Когда вы пытаетесь вставить в заказы после изменения его в InnDB, вы должны получить «Невозможно добавить или обновить дочернюю строку: сбой ограничения внешнего ключа». Проверьте снова двигатель после запуска запроса на изменение двигателя – raj

+0

Я проверил, и Engine is InnoDB ... http://pastebin.com/xCPm1Q6U Является ли InnoDB поддержкой внешних ключей? –

Смежные вопросы