我已经按照这篇文章:http://dev.mysql.com/doc/refman/5.0/en/innodb-foreign-key-constraints.html在两个表之间创建了一个外键。每一次尝试都失败了。有什么我想念的吗?!
真的很令人沮丧,我从没想过会遇到这个问题!
感谢。
答案 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
);
如果你详细说明你正在尝试的和/或你得到的错误,我可以提供更多帮助。