我知道他们的问题是什么,你如何链接它们,或者当你在不同的表中有相同的名字时,它们会自动链接。 这是一个例子:
假设我有[orders]表和[customer]表。 [orders]表中的每一行都有一个customer_id号,该号码与[customer]表中的customer_id相关联。 那么如何通过参考订单获取客户信息? 什么是SQL查询?
答案 0 :(得分:7)
...如何链接它们,或者当您在不同的表中使用相同的名称时,它们会自动链接。
这不是自动的,您必须在customer_id
表的order
列上添加foreign key constraint。这可以在创建表时或使用ALTER语句完成。查看文档以获取详细信息。正如其他人指出的那样,请注意两个表都需要是InnoDB表(MyISAM存储引擎不支持外键约束,而忽略它们)。
无论有没有FK约束,查询都是这样的:
SELECT *
FROM CUSTOMER C, ORDER O
WHERE C.ID = O.CUSTOMER_ID
AND O.ID = ...
FK约束“只是”保证ORDER表的CUSTOMER_ID列不能包含CUSTOMER表中不存在的值(可能为NULL除外),从而强制引用完整性。
答案 1 :(得分:4)
外键是不通过通用名称自动链接。经常让人们对MySQL外键感到困惑的一件事是MyISAM表引擎(默认)根本不支持外键。 MySQL不是在向MyISAM表添加外键时给出错误消息,而是默默地忽略外键定义。 InnoDB表引擎支持外键,因此您应确保要添加外键的所有表都是InnoDB表类型。要添加外键,您可以执行以下操作:
alter table fk_table add foreign key (fk_column) references pk_table (pk_column);
答案 2 :(得分:3)
我会假设你在问,因为你阅读了文档并且对你没有意义。
外键(FK)是TableB中的一个字段,它与TableA中的字段(通常是主键(PK))保持相同的值。所以在伪代码中:
Create TableA:
A_id is PK,
somefield,
anotherfield
Create TableB:
B_id is PK,
A_id is FK to TableA,
farmfield,
outstandingfield
Create constraint on TableB:
In TableB A_id references TableA(A_id),
Don't allow updates to TableA(A_id),
Delete records from TableB that have the same A_id as deleted records in TableA
然后,当您执行涉及两个表的查询时,您可以加入FK:
SELECT a.somefield, b.farmfield FROM TableA a JOIN TableB b ON (a.A_id=B.A_id);
当您从TableA中删除时,您不必从TableB中删除。它会自动发生,因为约束表示“从TableB中删除与TableA中已删除记录具有相同A_id的记录”。
当您插入TableB时,您必须提供有效的A_id,或者,根据您定义列的方式,离开A_id =NULL
。
答案 3 :(得分:1)
mysql中的外键仅适用于某些数据库引擎。 MyISAM不是其中之一。
我试图将它们与InnoDB一起使用,虽然它确实保证了数据的一致性,但我发现它是一个巨大的性能命中,导致许多锁定的表永远不会被锁定。
使用外键的主要优点是确保您从未拥有数据库中没有客户的订单。但您仍然需要通过查询访问客户。
select * from customer, order where order.customer_id = customer.id and order.id = 5
上面的查询向您展示了如何通过延迟连接访问它的一般概念,虽然它是干编码的,但我可能有一两个错字。
我对外键的一般看法是它们很棒,但在MySQL中不可用,而Postgres处理它们要好得多。
答案 4 :(得分:-1)
http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html
在谷歌上搜索“mysql外键”时的第一个结果。完成示例。