2014-01-09 115 views
0

我是SQL的新手,我想在两个表之间创建一个One-To-Many关系。 我有以下的数据库查询这两个表:SQL一对多关系

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

“show table status”应该给你引擎类型 – raj

回答

0

我放弃了,使用MySQL的Web客户端启动...

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 table_name ENGINE = InnoDB;'但它仍然允许我添加无效的'CustomerId' ...这是我所做的http://pastebin.com/5mXmCwHM,最后我可以添加一个客户用id 9,当我在'客户'表中只有5个客户时...我做错了什么或者改变表格不起作用? –

+0

当您尝试将其更改为InnDB后插入到订单中时,您应该会看到“无法添加或更新子行:外键约束失败”。在运行alter engine查询后,再次检查引擎 – raj

+0

我选中并且引擎是InnoDB ... http://pastebin.com/xCPm1Q6U InnoDB是否支持外键? –