#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 в базе данных… Таким образом, пользователь, с которым вы входите в приложение, может не иметь доступа к схеме игры; вот почему вы не можете выбирать из нее.