Выбор из представления MySQL

#mysql #sql #phpmyadmin

#mysql #sql #phpmyadmin

Вопрос:

Я пишу простой веб-сервис для входа пользователя и сталкиваюсь с проблемой при выборе данных из представления, созданного в phpmyadmin.

SQLs

Это мои таблицы (не каждый столбец, но важные).

таблица учетных записей

 CREATE TABLE generel.account ( 
  id INT NOT NULL auto_increment ,
  username VARCHAR(15) NOT NULL ,
  mail VARCHAR(30) NOT NULL ,
  password VARCHAR(20) NOT NULL ,
  ...
  PRIMARY KEY (user_id),
  UNIQUE username (username),
  UNIQUE `mail` (mail)
);
  

таблица userstatus

 CREATE TABLE game.userstatus (
  user_id INT NOT NULL ,
  is_logged_in BOOLEAN NOT NULL ,
  ...
  PRIMARY KEY `ip` (`last_known_ip`)
);
  

с помощью внешнего ключа

 ALTER TABLE userstatus
  ADD CONSTRAINT fk_generel.account.id
  FOREIGN key (user_id)
  REFERENCES generel.account(user_id) 
  ON DELETE CASCADE 
  ON UPDATE CASCADE;
  

Пожалуйста, обратите внимание, что библиотеки sql отличаются (generel и game).

Это представление, с которым я хочу работать:

 CREATE VIEW game.gameuser_view AS 
SELECT
  acc.id AS user_id ,
  acc.username ,
  acc.password ,
  acc.mail ,
  usrsts.is_logged_in
  ...
FROM
  generel.account AS acc 
  INNER JOIN
    game.userstatus AS usrsts 
    ON acc.id = usrsts.user_id
  

Ожидаемое поведение

При выборе данных из представления результат не должен быть пустым, но зависеть от предложения where. При вставке в представление данные должны перенаправляться в обе таблицы и также выбираться из представления.

Проблемы

  • не удается выбрать из представления
  • можно вставить в представление, но все еще не выбрать
  • данные будут перенаправлены в таблицу account, но не в таблицу userstatus

Как я уже упоминал, я пишу веб-сервис для входа в систему, и там также сохраняются те же проблемы. (Я не проверял вставку, потому что регистрация происходит где-то в другом месте.)

Комментарии:

1. Вы пытались просто запустить свой SELECT , чтобы посмотреть, возвращает ли он что-нибудь?

2. Уверен, что вы можете обновить только представление для ОДНОЙ таблицы. Что касается выбора через представление …. имеет ли пользователь, вошедший в систему, доступ к схеме игры? В документах указано : «Кроме того, только одна таблица в определении представления может быть обновлена, поэтому предложение SET должно называть только столбцы из одной из таблиц в представлении»

3. @xQbert пользователь, которого я тестирую, является root, так что да, пользователь имеет все права, поэтому в основном представление предназначено для моей цели (вставка при регистрации, обновление при входе в систему строки is_logged_in и выбор пароля для сравнения при входе в систему) бесполезно? как бы вы подошли к этому, когда происходит регистрация на веб-интерфейсе и вход в игру, для которой я пишу этот сервис? схемы являются общими (таблицы, используемые веб-интерфейсом и игрой), game (используются только моей игрой) и webfrontend (используются только веб-интерфейсом). Вот почему мне нужно объединить их в представлении.

4. Какой еще может быть цель представления, когда вы не можете выполнить какие-либо SQLL для них? Трата места? 🙂

5. Вы можете выбрать из представления; что-то в вашей настройке неверно. Обычно я указываю «Root» как пользователя операционной системы, а не как пользователя dtabase; если только вы не создали учетную запись пользователя root в базе данных… Таким образом, пользователь, с которым вы входите в приложение, может не иметь доступа к схеме игры; вот почему вы не можете выбирать из нее.