mysql - 如何定义外键约束

标签 mysql

我有三个 mysql 表。表已创建。

Requests -  request_id, request_message, user_id
Responses - response_id, response_message, user_id
users -     user_id, user_name

现在我想定义外键约束,这样

1. If user_id is not present in Users table, and someone is inserting the data in Requests or Responses for that user_id -- then error
2. If request_id is not present in Requests table, then if someone is inserting in responses table for that request_id -- then error 

3. If someone deletes an user_id, all associated requests and responses with that user_id should be deleted automatically.
4. If someone deletes an request_id, all the associated responses with it, should be deleted automatically.    

如果我遗漏了什么,请告诉我。

如何实现这个功能?

谢谢

德维什

最佳答案

这里是创建表的完整 SQL:

CREATE TABLE IF NOT EXISTS `reponses` (
  `response_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `response_message` varchar(45) DEFAULT NULL,
  `user_id` int(10) unsigned NOT NULL,
  PRIMARY KEY (`response_id`,`user_id`),
  KEY `fk_reponses_users1` (`user_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4 AUTO_INCREMENT=3 ;


CREATE TABLE IF NOT EXISTS `requests` (
  `request_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `request_message` varchar(45) DEFAULT NULL,
  `user_id` int(10) unsigned NOT NULL,
  PRIMARY KEY (`request_id`,`user_id`),
  KEY `fk_requests_users` (`user_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4 AUTO_INCREMENT=3 ;


CREATE TABLE IF NOT EXISTS `users` (
  `user_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `user_name` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4 AUTO_INCREMENT=3 ;


ALTER TABLE `reponses`
  ADD CONSTRAINT `reponses_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`user_id`) ON DELETE CASCADE ON UPDATE NO ACTION;

ALTER TABLE `requests`
  ADD CONSTRAINT `requests_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`user_id`) ON DELETE CASCADE ON UPDATE NO ACTION;

允许您删除与用户相关的记录的选项是ON DELETE CASCADE。默认情况下,MySql 设置NO ACTION,它指的是RESTRICT,并且不允许删除具有相关对象的父记录。我认为您没有提到响应和请求之间的关系,但您应该明白;)。

关于mysql - 如何定义外键约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10871928/

相关文章:

php - PHP 中的 Zip 文件

mysql - SQL连接五个表

mysql - 选择两个不同行中具有一定值的所有零件号

php - 删除 unicode 项目符号字符

MySQL 语法错误插入

php - 使用get方法更新数据

php - friend 建议或二级相关(linkedin)算法是如何工作的

mysql - 仅使用唯一记录更新 MySQL 表?

php - 使用数据库中存储的 x 和 y 坐标从数据库获取数据的位置

MySQL 存储过程 BEGIN/END 语句抛出错误