我已经按照这篇文章:http ://dev.mysql.com/doc/refman/5.0/en/innodb-foreign-key-constraints.html在两个表之间创建外键。每一次尝试都失败了。有什么我想念的吗?!
这真的很令人沮丧,我根本没想到会遇到这个问题!
谢谢。
我已经按照这篇文章:http ://dev.mysql.com/doc/refman/5.0/en/innodb-foreign-key-constraints.html在两个表之间创建外键。每一次尝试都失败了。有什么我想念的吗?!
这真的很令人沮丧,我根本没想到会遇到这个问题!
谢谢。
您没有显示您尝试了什么或错误是什么,因此所有答案都只是猜测。
以下是在外键可以工作之前必须为真的事情的清单:
必须启用 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在此线程上的回答)。
到底出了什么问题?如果没有详细信息,我们真的无法帮助您...
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)
对我来说很好。
您必须记住的一件事是,如果您的子表/列具有父表/列中不存在的值,您将始终收到错误消息。
例子:
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
);
如果您详细说明您正在尝试的内容和/或您遇到的错误,我可以提供更多帮助。