我正在尝试在我的表上设置外键约束,以便在删除主键时自动删除该行
主表是
CREATE TABLE IF NOT EXISTS `tbl_users` (
`user_id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(250) NOT NULL,
`password` varchar(250) NOT NULL,
`user_role` varchar(100) NOT NULL DEFAULT 'staff',
`user_name` varchar(250) NOT NULL DEFAULT 'staff name',
`user_email` varchar(250) NOT NULL,
`user_phone` varchar(15) NOT NULL,
`user_login_status` tinyint(1) NOT NULL,
PRIMARY KEY (`user_id`)
) ENGINE=MyISAM;
,外键表是
CREATE TABLE IF NOT EXISTS `tbl_user_meta` (
`user_id` int(11) NOT NULL,
`staff_id` int(11) NOT NULL,
`dep_id` int(11) NOT NULL,
`class_id` int(11) NOT NULL,
`subject_id` int(11) NOT NULL
) ENGINE=MyISAM
我使用以下查询来设置外键
alter table tbl_user_meta add foreign key('user_id') references tbl_users('user_id') on delete cascade;
查询正常,但外键约束无效 请帮帮我
我在Windows上使用wamp服务器使用mysql 5.6.12
答案 0 :(得分:3)
MyISAM Engine不支持外键约束。
Foreign Key Differences
InnoDB存储引擎支持检查外键 约束,包括CASCADE,ON DELETE和ON UPDATE。见章节 14.2.3.4,“InnoDB和FOREIGN KEY约束” 对于InnoDB以外的存储引擎,MySQL Server解析FOREIGN CREATE TABLE语句中的KEY语法,但不使用或存储它。
为了能够使用FK约束,您必须使用 InnoDB 引擎。
您可以通过这种方式更改表格的引擎
ALTER TABLE tbl_users ENGINE = InnoDB;
ALTER TABLE tbl_user_meta ENGINE = InnoDB;
更新您可以使用此查询为所有表生成ALTER TABLE
个语句
SELECT GROUP_CONCAT(CONCAT(
'ALTER TABLE `', table_name, '` ENGINE=InnoDB') SEPARATOR ';\n')
FROM information_schema.tables
WHERE table_schema = SCHEMA()
AND ENGINE = 'MyISAM';
然后只需复制并执行它们
这是 SQLFiddle 演示
答案 1 :(得分:1)
使用INNODB。
请在此处查看详细信息http://dev.mysql.com/doc/refman/5.0/en/ansi-diff-foreign-keys.html。