By using db<>fiddle, you agree to license everything you submit by Creative Commons CC0.
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(100),
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
CREATE TRIGGER tr_users_bi
BEFORE INSERT ON users
FOR EACH ROW
BEGIN
DECLARE allowed_created_at DATETIME;
DECLARE error_message_text VARCHAR(64);
SELECT MAX(created_at) + INTERVAL 12 HOUR INTO allowed_created_at
FROM users
WHERE username = NEW.username;
IF NEW.created_at < allowed_created_at THEN
SET error_message_text = CONCAT('Регистрация возможна не ранее ', allowed_created_at);
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = error_message_text;
END IF;
END
INSERT INTO users (username) VALUES ('Иванов'), ('Петров'), ('Сидоров');
SELECT * FROM users;
Records: 3 Duplicates: 0 Warnings: 0
id | username | created_at |
---|---|---|
1 | Иванов | 2024-01-30 12:12:08 |
2 | Петров | 2024-01-30 12:12:08 |
3 | Сидоров | 2024-01-30 12:12:08 |
-- Вставляем Иванова, указываем явно дату-время через 15 часов
INSERT INTO users (username, created_at) VALUES ('Иванов', CURRENT_TIMESTAMP + INTERVAL 15 HOUR);
SELECT * FROM users;
id | username | created_at |
---|---|---|
1 | Иванов | 2024-01-30 12:12:08 |
2 | Петров | 2024-01-30 12:12:08 |
3 | Сидоров | 2024-01-30 12:12:08 |
4 | Иванов | 2024-01-31 03:12:08 |
-- Вставляем Петрова, указываем явно дату-время через 9 часов
-- Генерируется сообщение об ошибке;
INSERT INTO users (username, created_at) VALUES ('Петров', CURRENT_TIMESTAMP + INTERVAL 9 HOUR);
Регистрация возможна не ранее 2024-01-31 00:12:08
-- Убеждаемся, что запись не вставлена
SELECT * FROM users;
id | username | created_at |
---|---|---|
1 | Иванов | 2024-01-30 12:12:08 |
2 | Петров | 2024-01-30 12:12:08 |
3 | Сидоров | 2024-01-30 12:12:08 |
4 | Иванов | 2024-01-31 03:12:08 |