1.以下是直接从数据库导出的建表语句。
1 -- ---------------------------- 2 -- Table structure for files 3 -- ---------------------------- 4 DROP TABLE IF EXISTS `files`; 5 CREATE TABLE `files` ( 6 `id` int(11) NOT NULL, 7 `fileName` varchar(50) DEFAULT NULL, 8 `filePath` varchar(200) DEFAULT NULL, 9 `updateDate` datetime DEFAULT NULL, 10 `userId` int(11) DEFAULT NULL, 11 PRIMARY KEY (`id`) 12 ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 13 14 -- ---------------------------- 15 -- Table structure for users 16 -- ---------------------------- 17 DROP TABLE IF EXISTS `users`; 18 CREATE TABLE `users` ( 19 `id` int(11) NOT NULL AUTO_INCREMENT, 20 `name` varchar(30) DEFAULT NULL, 21 `email` varchar(50) DEFAULT NULL, 22 `age` int(11) DEFAULT NULL, 23 `phone` varchar(20) DEFAULT NULL, 24 PRIMARY KEY (`id`) 25 ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
2.我们把表files和表users建立关系,给表files添加外键files_users_fk,并在files_users_fk上建立索引。
1 -- ---------------------------- 2 -- Table structure for files 3 -- ---------------------------- 4 DROP TABLE IF EXISTS `files`; 5 CREATE TABLE `files` ( 6 `id` int(11) NOT NULL, 7 `user_id` int(11) NULL, 8 `fileName` varchar(50) DEFAULT NULL, 9 `filePath` varchar(200) DEFAULT NULL, 10 `updateDate` datetime DEFAULT NULL, 11 `userId` int(11) DEFAULT NULL, 12 PRIMARY KEY (`id`), 13 KEY `files_users_fk` (`user_id`) 14 ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 15 16 -- ---------------------------- 17 -- Table structure for users 18 -- ---------------------------- 19 DROP TABLE IF EXISTS `users`; 20 CREATE TABLE `users` ( 21 `id` int(11) NOT NULL AUTO_INCREMENT, 22 `name` varchar(30) DEFAULT NULL, 23 `email` varchar(50) DEFAULT NULL, 24 `age` int(11) DEFAULT NULL, 25 `phone` varchar(20) DEFAULT NULL, 26 PRIMARY KEY (`id`) 27 ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8; 28 29 ALTER TABLE files ADD CONSTRAINT files_users_fk FOREIGN KEY(`user_id`) REFERENCES users(`id`);
可以看出 files 依赖表users ,依赖表不能先删除。也就是说,需要先删除当前表,再删除外键关联表
我们来看看概念:
先看On Delete属性,可能取值为:No Action, Cascade,Set Null, Restrict属性。
当取值为No Action或者Restrict时,则当在父表(即外键的来源表)中删除对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除。
当取值为Cascade时,则当在父表(即外键的来源表)中删除对应记录时,首先检查该记录是否有对应外键,如果有则也删除外键在子表(即包含外键的表)中的记录。
当取值为Set Null时,则当在父表(即外键的来源表)中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为null(不过这就要求该外键允许取null)。
On Update是一样的?
当取值为No Action或者Restrict时,则当在父表(即外键的来源表)中更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许更新。
当取值为Cascade时,则当在父表(即外键的来源表)中更新对应记录时,首先检查该记录是否有对应外键,如果有则也更新外键在子表(即包含外键的表)中的记录。
当取值为Set Null时,则当在父表(即外键的来源表)中更新对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为null(不过这就要求该外键允许取null)。
比如:
ALTER TABLE files ADD CONSTRAINT files_users_fk FOREIGN KEY(`user_id`) REFERENCES users(`id`) ON DELETE SET NULL ON UPDATE CASCADE;
--
时间: 2024-10-07 15:29:20