Mysql:添加外键不会在 MyISAM 表上发出警告/错误

标签 mysql foreign-keys warnings innodb myisam

这是我制作的表格:

mysql> show create table notes;
+-------+----------------------------------------------------+
| Table | Create Table                                                                                                                                                                                                                                                                                                                                                  |
+-------+----------------------------------------------------+
| notes | CREATE TABLE `notes` (
  `id` int(11) NOT NULL auto_increment,
  `note` text NOT NULL,
  `status` enum('active','hidden','deleted','followup','starred') default NULL,
  `created` datetime NOT NULL,
  `last_updated` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 |
+-------+----------------------------------------+

我尝试添加外键约束:

mysql> alter table notes add constraint foreign key(`id`) references `notetypes`.`id` on update cascade on delete restrict;
Query OK, 0 rows affected (0.15 sec)
Records: 0  Duplicates: 0  Warnings: 0

没有错误!没有警告!由于这个原因,我已经使用没有外键的内部数据库(假设它们存在)有一段时间了。知道这是一个错误还是我做错了什么? mysql 中是否有可以避免此类陷阱的解决方法或选项?

<小时/>
$ mysql --version
mysql  Ver 14.12 Distrib 5.0.75, for debian-linux-gnu (i486) using readline 5.2
<小时/>

谢谢

日本

最佳答案

myISAM 不执行引用完整性。添加此类约束似乎是合法的,因此不会出现错误,但只要引擎是 myISAM,就不会强制执行约束。不过,它确实存储了创建的 key ,以便用户可以看到其意图。

关于Mysql:添加外键不会在 MyISAM 表上发出警告/错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40554820/

相关文章:

mysql - 说明 - 默认外键约束 - InnoDB

mysql - 如何更新多个相同的外键值,它是 laravel 中的文件类型

c++ - 我怎样才能打开(字面上)GCC的所有警告?

mysql - Mercurial 和MySQL

php - 创建合并 2 行的 CSV 并将值设置为 codeigniter 中的标题

python - 检查外键是否彼此相等

c++ - 关于 const 禁止的重言式比较的警告?

javascript - 为什么我收到 Functions is not valid as a React child?

MySQL - 使用左连接获取未分配资源的复杂查询

php - 使用 Symfony 和 Doctrine 更新最后一个数据库条目