这些SQL语法之间有什么区别?

时间:2012-12-04 04:56:28

标签: sql foreign-keys create-table

我正在寻找有关外键的信息....再次! ......并且碰巧在webschools.com上注意到他们有不同的例子。对于他们的外键示例

CREATE TABLE Orders
(
O_Id int NOT NULL,
OrderNo int NOT NULL,
P_Id int,
PRIMARY KEY (O_Id),
FOREIGN KEY (P_Id) REFERENCES Persons(P_Id)
)

CREATE TABLE Orders
(
O_Id int NOT NULL PRIMARY KEY,
OrderNo int NOT NULL,
P_Id int FOREIGN KEY REFERENCES Persons(P_Id)
)

CREATE TABLE Orders
(
O_Id int NOT NULL,
OrderNo int NOT NULL,
P_Id int,
PRIMARY KEY (O_Id),
CONSTRAINT fk_PerOrders FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)
)

现在..........

有什么区别?...

我如何知道我认为哪一个用于我的数据库?我有一种感觉,这将有助于解决我对SQL的许多困惑......

3 个答案:

答案 0 :(得分:2)

效果没有区别:他们完全一样。

我更喜欢内联版本,因为它使fk定义尽可能接近列定义。

还有第三种方式 - 单独的alter table声明(我认为这是“官方”方式):

alter table orders
add contraint fk_PerOrders 
foreign key p_id references persons(p_id);

您可能会发现某些数据库不支持某个版本或其他版本。

答案 1 :(得分:1)

所有人都在做同样的事情。使用您认为易于理解的那个。

答案 2 :(得分:1)

所有人都这样做(三种方式):

  • 首先,您首先将P_Id定义为int,然后定义外键约束。
  • 第二,P_Id int FOREIGN KEY REFERENCES Persons(P_Id)P_Id是同一行排便和外键约束排便。

  • 第三,a foreign key constraint name也是fk_PerOrders。可以是useful later when you wants to drop constraint。例如

  

ALTER TABLE订单
      DROP FOREIGN KEY fk_PerOrders

给约束命名总是好的做法。