【发布时间】:2019-07-17 06:28:14
【问题描述】:
NodeJS ORM Sequelize 使用 INFORMATION_SCHEMA.TABLE_CONSTRAINTS to show constraints 并且我遇到了一个问题,即该查询中未显示约束但确实存在,因此我无法在续集迁移中更改约束。
我不确定这是续集问题还是 MySQL 问题,但让我摸不着头脑的原始 SQL 是:
mysql> use rypedb; SHOW INDEX FROM teacher_information;
Database changed
+---------------------+------------+-----------------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+--------
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment
+---------------------+------------+-----------------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+--------
| teacher_information | 0 | PRIMARY | 1 | id | A | 143 | NULL | NULL | | BTREE |
| teacher_information | 1 | teacher_information_teacher_id_fk | 1 | account_id | A | 143 | NULL | NULL | | BTREE |
+---------------------+------------+-----------------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+--------
2 rows in set (0.00 sec)
mysql> select * from INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_NAME = 'teacher_information_teacher_id_fk' AND TABLE_SCHEMA = 'rypedb';
Empty set, 2 warnings (0.01 sec)
是否预计INFORMATION_SCHEMA.TABLE_CONSTRAINTS 不应具有SHOW INDEX 查询中显示的索引?它确实显示了其他限制,这是我第一次看到这个问题。
这是我的 create table 语句的输出:
| teacher_information | CREATE TABLE `teacher_information` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`account_id` int(10) unsigned NOT NULL,
`description` varchar(1024) DEFAULT NULL,
`image_url` varchar(256) DEFAULT NULL,
`bio_link` varchar(256) DEFAULT NULL,
`created_at` datetime DEFAULT NULL,
`updated_at` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `teacher_information_teacher_id_fk` (`account_id`)
) ENGINE=InnoDB AUTO_INCREMENT=144 DEFAULT CHARSET=utf8 |
【问题讨论】:
-
约束的名称并不总是与键的名称相同。试试
WHERE table_name = 'teacher_information' -
你能显示
show create table teacher_information的输出吗? -
这看起来就像如果你有一个外键约束你会看到的,但是删除了它。 FK 创建非唯一索引和外键约束,移除 FK 会移除约束但保留索引。
-
我同意巴马尔的观点。这里的错误似乎是期望外键 constraint 的名称将匹配 index (键)的名称,或者外键约束存在于给定索引。两个(或更多)FK 约束也可以使用相同的索引。没有显示不良状态,除非意图是应该有一个外键约束,例如
CONSTRAINT teacher_information_teacher_id_fk FOREIGN KEY (account_id) REFERENCES foo (bar) ON UPDATE CASCADE ON DELETE RESTRICT。即有一个没有外键约束的索引是有效的)。 -
是的,这看起来像您删除了
account_id上的 FK 约束,但没有删除索引。
标签: mysql sequelize.js