MYSQL: Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполнено. Попытка добавить пользователя в группу пользователей - PullRequest
0 голосов
/ 06 апреля 2020

Я пытаюсь понять, почему я не могу добавить пользователей. Это проблема с настройкой базы данных? или просто проблема с синтаксисом? Нужны некоторые указания.

При попытке просто вставить существующий user_id в существующий room_id я продолжаю получать

Запрос:

INSERT INTO group_users (room_id, user_id) VALUES(1, 3);

ERROR: Cannot add or update a child row: a foreign key constraint fails

ИД пользователя, и ИД комнаты уже существуют в базе данных. Хотите знать, что мне нужно сделать.

для справки вот схема базы данных:


CREATE TABLE `groups` (
  `room_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `room_name` varchar(60) NOT NULL,
  PRIMARY KEY (`room_id`),
  UNIQUE KEY `room_name` (`room_name`)
)ENGINE=InnoDB;


-- Chatapp.users definition

CREATE TABLE `users` (
  `user_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar(60) NOT NULL,
  `language` varchar(32) DEFAULT 'english',
  `SocketID` varchar(42) DEFAULT NULL,
  `email` varchar(60) DEFAULT NULL,
  `password` varchar(255) DEFAULT NULL,
  `registered_on` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `confirmed_email` tinyint(1) NOT NULL DEFAULT '0',
  `confirmed_on` datetime DEFAULT NULL,
  PRIMARY KEY (`user_id`),
  UNIQUE KEY `username` (`username`)
)ENGINE=InnoDB;


-- Chatapp.group_users definition

CREATE TABLE `group_users` (
  `room_id` bigint(20) unsigned NOT NULL,
  `user_id` bigint(20) unsigned NOT NULL,
  PRIMARY KEY (`room_id`,`user_id`),
  KEY `group_users_fk2` (`user_id`),
  CONSTRAINT `group_users_fk1` FOREIGN KEY (`room_id`) REFERENCES `groups` (`room_id`),
  CONSTRAINT `group_users_fk2` FOREIGN KEY (`user_id`) REFERENCES `users` (`user_id`)
) ENGINE=InnoDB;


-- Chatapp.messages definition

CREATE TABLE `messages` (
  `message_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` bigint(20) unsigned DEFAULT NULL,
  `message` mediumtext COLLATE utf8mb4_bin,
  `timestamp` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`message_id`),
  KEY `messages_fk1` (`user_id`),
  CONSTRAINT `messages_fk1` FOREIGN KEY (`user_id`) REFERENCES `users` (`user_id`)
) ENGINE=InnoDB CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

Ответы [ 2 ]

1 голос
/ 06 апреля 2020

Если я изменил group_id на room_id, теперь он работает нормально:

CREATE TABLE `group_users` (
  `room_id` bigint(20) unsigned NOT NULL,
  `user_id` bigint(20) unsigned NOT NULL,
  PRIMARY KEY (`room_id`,`user_id`),
  KEY `group_users_fk2` (`user_id`),
  CONSTRAINT `group_users_fk1` FOREIGN KEY (`room_id`) REFERENCES `groups` (`room_id`),
  CONSTRAINT `group_users_fk2` FOREIGN KEY (`user_id`) REFERENCES `users` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `users` (`user_id`, `username`, `language`, `SocketID`, `email`, `password`, `registered_on`, `confirmed_email`, `confirmed_on`) VALUES (NULL, 'pavel', 'english', NULL, NULL, NULL, CURRENT_TIMESTAMP, '0', NULL);
INSERT INTO `users` (`user_id`, `username`, `language`, `SocketID`, `email`, `password`, `registered_on`, `confirmed_email`, `confirmed_on`) VALUES (NULL, 'bob', 'english', NULL, NULL, NULL, CURRENT_TIMESTAMP, '0', NULL);
INSERT INTO `groups` (`room_id`, `room_name`) VALUES (NULL, 'room1');
INSERT INTO `groups` (`room_id`, `room_name`) VALUES (NULL, 'room2');
INSERT INTO `group_users` (`room_id`, `user_id`) VALUES ('1', '2');
INSERT INTO `group_users` (`room_id`, `user_id`) VALUES ('1', '1');

результат:

+---------+---------+
| room_id | user_id |
+---------+---------+
|       1 |       1 |
|       1 |       2 |
+---------+---------+
0 голосов
/ 06 апреля 2020

Является ли rooms таким же, как groups? Обратите внимание, что в таблице groups нет room_id, как предполагает ваше ограничение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...