0

我已经按照这篇文章:http ://dev.mysql.com/doc/refman/5.0/en/innodb-foreign-key-constraints.html在两个表之间创建外键。每一次尝试都失败了。有什么我想念的吗?!

这真的很令人沮丧,我根本没想到会遇到这个问题!

谢谢。

4

4 回答 4

3

您没有显示您尝试了什么或错误是什么,因此所有答案都只是猜测。

以下是在外键可以工作之前必须为真的事情的清单:

  • 必须启用 InnoDB 存储引擎。

    mysql> SHOW VARIABLES LIKE 'have_innodb';
    
  • 两个表都必须使用 InnoDB 存储引擎(MyISAM 不支持引用完整性约束)。

    mysql> SHOW CREATE TABLE <parent_table>;
    mysql> SHOW CREATE TABLE <child_table>;
    
  • 引用表中的列必须是键的最左侧列。通常这是主键,但 InnoDB 实际上允许它们成为任何键的一部分。

  • 外键列及其引用的主键列必须是完全相同的数据类型(必须匹配有符号与无符号、整数与大整数、字符串字符集等)。仅允许字符串长度不同。

  • 您必须正确使用约束声明语法。:-)

  • 如果要向填充表添加约束,则所有现有值都必须满足约束(感谢 Jordan S. Jones在此线程上的回答)。

于 2009-06-08T03:09:16.303 回答
1

到底出了什么问题?如果没有详细信息,我们真的无法帮助您...

mysql> CREATE TABLE parent (id INT NOT NULL,
    ->                      PRIMARY KEY (id)
    -> ) ENGINE=INNODB;
Query OK, 0 rows affected (0.01 sec)
mysql> CREATE TABLE child (id INT, parent_id INT,
    ->                     INDEX par_ind (parent_id),
    ->                     FOREIGN KEY (parent_id) REFERENCES parent(id)
    ->                       ON DELETE CASCADE
    -> ) ENGINE=INNODB;
Query OK, 0 rows affected (0.01 sec)

对我来说很好。

于 2009-06-08T00:50:18.563 回答
1

您必须记住的一件事是,如果您的子表/列具有父表/列中不存在的值,您将始终收到错误消息。

于 2009-06-08T01:03:01.597 回答
0

例子:

use trading_research;
drop table if exists stock_history;
create table stock_history
(
        company_id integer(4) NOT NULL,
        price_date date NOT NULL,
        primary key(company_id, price_date),
        opening_price decimal(10,2) NULL,
        closing_price decimal(10,2) NULL,
        high_price decimal(10,2) NULL,
        low_price decimal(10,2) NULL,
        adjusted_closing_price decimal(10,2) NULL,
        volume decimal(20, 2) NULL,
        constraint foreign key (company_id) references stock_company (company_id) on delete cascade on update cascade
);

如果您详细说明您正在尝试的内容和/或您遇到的错误,我可以提供更多帮助。

于 2009-06-08T00:52:20.713 回答