MySQL中的外键创建问题

时间:2009-06-08 00:45:20

标签: mysql foreign-keys entity-relationship

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

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

感谢。

4 个答案:

答案 0 :(得分:3)

您没有显示您尝试的内容或错误的内容,因此所有答案都只是猜测。

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

  • 必须启用InnoDB存储引擎。

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

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

  • 外键列及其引用的主键列必须完全相同的数据类型(必须匹配signed与unsigned,int与bigint,字符串charset等) 。只允许字符串长度不同。

  • 您必须获得constraint declaration syntax权限。 : - )

  • 如果您要为填充表添加约束,则所有现有值必须满足约束(感谢Jordan S. Jones'answer在此线程上)。

答案 1 :(得分: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)

对我来说很好。

答案 2 :(得分:1)

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

答案 3 :(得分: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
);

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