mysql没有为外键选择引用列_外键在MySQL中不起作用:为什么我可以插入一个不在外部列中的值?...

我猜想你的默认存储引擎是MyISAM,它忽略了外键约束.它默认地接受外键的声明,但不存储约束或随后执行.

但是,它隐式地在为外键声明的列上创建一个索引.在MySQL中,“KEY”是“INDEX”的同义词.这就是DESCRIBE输出中显示的内容:索引,而不是约束.

您现在可以将无效的值插入到表中,因为没有约束.要获得强制引用完整性的约束,您必须使用InnoDB存储引擎:

CREATE TABLE actions (

A_id int NOT NULL AUTO_INCREMENT,

...

CONSTRAINT fk_Question FOREIGN KEY (Q_id) REFERENCES questions(P_id),

CONSTRAINT fk_User FOREIGN KEY (U_id) REFERENCES users(P_id)

) ENGINE=InnoDB;

我一直以来认为MySQL的一个很大的错误是默认忽略外键约束声明.没有错误或警告,存储引擎不支持它们.

顺便说一句,CHECK约束也是如此.没有与MySQL一起使用的存储引擎支持CHECK约束,但是SQL解析器不接受它们的接受.

当无法创建InnoDB表时,会发生错误150问题,因为它无法理解外键约束.您可以通过以下方式获取更多信息:

SHOW ENGINE INNODB STATUS;

InnoDB外键的一些要求:

>引用表也必须是InnoDB.

>引用表必须具有索引和主键.

> FK列和引用的PK列的SQL数据类型必须相同.例如,INT不匹配BIGINT或INT UNSIGNED.

您可以更改其中包含数据的表的存储引擎:

ALTER TABLE actions ENGINE=InnoDB;

这有效地将整个MyISAM表复制到InnoDB表,然后一旦成功,它将删除MyISAM表,并将新的InnoDB表重命名为前MyISAM表的名称.这被称为“表重组”,它可能是耗时的,具体取决于表中的数据量.在ALTER TABLE中发生表重组,即使在某些情况下也可能看起来不必要.

重新更新2:

I’m told that it’s important to enforce data integrity with functional foreign keys, but also that InnoDB should not be used with MySQL. What do you recommend?

你告诉过你呢这绝对是假的InnoDB has better performance than MyISAM(尽管InnoDB需要更多关注tuning the configuration),InnoDB支持原子更改,交易,外键,而InnoDB更能抵御崩溃中的破坏性数据.

除非您运行旧的不受支持的MySQL版本(5.0或更早版本),否则您应该使用InnoDB作为默认存储引擎选择,并且只有在可以演示从MyISAM受益的特定工作负载时,才能使用MyISAM.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值