Implement user-specific question numbering and update database schema. Added triggers for automatic question numbering and adjustments upon deletion. Enhanced CRUD operations to manage user_question_number effectively.
This commit is contained in:
@@ -31,6 +31,7 @@ CREATE TABLE questions (
|
||||
answered_at DATETIME,
|
||||
is_read BOOLEAN DEFAULT FALSE,
|
||||
status TEXT DEFAULT 'pending' CHECK (status IN ('pending', 'answered', 'rejected', 'deleted')),
|
||||
user_question_number INTEGER,
|
||||
|
||||
-- Внешние ключи
|
||||
FOREIGN KEY (from_user_id) REFERENCES users(telegram_id) ON DELETE CASCADE,
|
||||
@@ -76,6 +77,8 @@ CREATE INDEX idx_questions_from_user_id ON questions(from_user_id);
|
||||
CREATE INDEX idx_questions_status ON questions(status);
|
||||
CREATE INDEX idx_questions_created_at ON questions(created_at);
|
||||
CREATE INDEX idx_questions_is_read ON questions(is_read);
|
||||
CREATE INDEX idx_questions_user_question_number ON questions(to_user_id, user_question_number);
|
||||
CREATE UNIQUE INDEX idx_questions_user_number_unique ON questions(to_user_id, user_question_number) WHERE status != 'deleted';
|
||||
|
||||
CREATE INDEX idx_user_blocks_blocker_id ON user_blocks(blocker_id);
|
||||
CREATE INDEX idx_user_blocks_blocked_id ON user_blocks(blocked_id);
|
||||
@@ -106,3 +109,39 @@ FOR EACH ROW
|
||||
BEGIN
|
||||
INSERT OR IGNORE INTO user_settings (user_id) VALUES (NEW.telegram_id);
|
||||
END;
|
||||
|
||||
-- Триггер для автоматического вычисления user_question_number при вставке
|
||||
CREATE TRIGGER calculate_user_question_number
|
||||
AFTER INSERT ON questions
|
||||
FOR EACH ROW
|
||||
WHEN NEW.user_question_number IS NULL
|
||||
BEGIN
|
||||
UPDATE questions
|
||||
SET user_question_number = (
|
||||
SELECT COALESCE(MAX(user_question_number), 0) + 1
|
||||
FROM questions q2
|
||||
WHERE q2.to_user_id = NEW.to_user_id
|
||||
AND q2.status != 'deleted'
|
||||
)
|
||||
WHERE id = NEW.id;
|
||||
END;
|
||||
|
||||
-- Триггер для пересчета номеров при удалении вопроса
|
||||
CREATE TRIGGER recalculate_user_question_numbers_on_delete
|
||||
AFTER UPDATE ON questions
|
||||
FOR EACH ROW
|
||||
WHEN NEW.status = 'deleted' AND OLD.status != 'deleted'
|
||||
BEGIN
|
||||
-- Устанавливаем user_question_number в NULL для удаленного вопроса
|
||||
UPDATE questions
|
||||
SET user_question_number = NULL
|
||||
WHERE id = NEW.id;
|
||||
|
||||
-- Пересчитываем номера для всех вопросов пользователя после удаленного
|
||||
UPDATE questions
|
||||
SET user_question_number = user_question_number - 1
|
||||
WHERE to_user_id = NEW.to_user_id
|
||||
AND user_question_number > OLD.user_question_number
|
||||
AND status != 'deleted'
|
||||
AND id != NEW.id;
|
||||
END;
|
||||
|
||||
Reference in New Issue
Block a user